在 C# 中使用哨兵进行合并排序会产生奇怪的输出
Merge Sort using sentinels in C# produces weird outputs
我正在尝试使用 C# 中的哨兵实现合并排序算法。
我要排序的数组:
int[] arr = { 9, 8, 7, 6, 5, 4 };
这是我的归并排序函数:
void MergeSort(int[] arr, int lowerIndex, int upperIndex)
{
if (upperIndex > lowerIndex)
{
int midIndex = (lowerIndex + upperIndex) / 2;
MergeSort(arr, lowerIndex, midIndex);
MergeSort(arr, midIndex + 1, upperIndex);
Merge(arr, midIndex, lowerIndex, upperIndex);
}
}
这是我的合并函数:
void Merge(int[] arr, int midIndex, int lowerIndex, int upperIndex)
{
int leftArrayLength = midIndex - lowerIndex + 1;
int rightArrayLength = upperIndex - midIndex;
int[] left = new int[leftArrayLength + 1];
int[] right = new int[rightArrayLength + 1];
for (int i = 0; i < leftArrayLength; i++)
{
left[i] = arr[i];
}
for (int j = 0; j < rightArrayLength; j++)
{
left[j] = arr[midIndex + j];
}
//Sentinels
left[leftArrayLength] = int.MaxValue;
right[rightArrayLength] = int.MaxValue;
int m = 0;
int n = 0;
for (int k = lowerIndex; k <= upperIndex; k++)
{
if (left[m] <= right[n])
{
arr[k] = left[m];
m += 1;
}
else
{
arr[k] = right[n];
n += 1;
}
}
}
它给出了一个奇怪的输出:
0 0 0 7 0 4
到目前为止,我已经按照 CLRS 中给出的伪代码反复检查了我的实现,但我没有发现我的实现有什么问题。
请告诉我哪里做错了。
您在 left
/right
数组初始化中至少有下几个错误:
- 对于
left
你应该从 lowerIndex
: 开始
for (int i = 0; i < leftArrayLength; i++)
{
left[i] = arr[lowerIndex + i];
}
- 对于
right
有两个错误 - 1) 数组名称和使用 left
的拼写错误 2) 索引 的“差一错误”
for (int j = 0; j < rightArrayLength; j++)
{
right[j] = arr[midIndex + 1 + j];
}
我正在尝试使用 C# 中的哨兵实现合并排序算法。
我要排序的数组:
int[] arr = { 9, 8, 7, 6, 5, 4 };
这是我的归并排序函数:
void MergeSort(int[] arr, int lowerIndex, int upperIndex)
{
if (upperIndex > lowerIndex)
{
int midIndex = (lowerIndex + upperIndex) / 2;
MergeSort(arr, lowerIndex, midIndex);
MergeSort(arr, midIndex + 1, upperIndex);
Merge(arr, midIndex, lowerIndex, upperIndex);
}
}
这是我的合并函数:
void Merge(int[] arr, int midIndex, int lowerIndex, int upperIndex)
{
int leftArrayLength = midIndex - lowerIndex + 1;
int rightArrayLength = upperIndex - midIndex;
int[] left = new int[leftArrayLength + 1];
int[] right = new int[rightArrayLength + 1];
for (int i = 0; i < leftArrayLength; i++)
{
left[i] = arr[i];
}
for (int j = 0; j < rightArrayLength; j++)
{
left[j] = arr[midIndex + j];
}
//Sentinels
left[leftArrayLength] = int.MaxValue;
right[rightArrayLength] = int.MaxValue;
int m = 0;
int n = 0;
for (int k = lowerIndex; k <= upperIndex; k++)
{
if (left[m] <= right[n])
{
arr[k] = left[m];
m += 1;
}
else
{
arr[k] = right[n];
n += 1;
}
}
}
它给出了一个奇怪的输出:
0 0 0 7 0 4
到目前为止,我已经按照 CLRS 中给出的伪代码反复检查了我的实现,但我没有发现我的实现有什么问题。
请告诉我哪里做错了。
您在 left
/right
数组初始化中至少有下几个错误:
- 对于
left
你应该从lowerIndex
: 开始
for (int i = 0; i < leftArrayLength; i++)
{
left[i] = arr[lowerIndex + i];
}
- 对于
right
有两个错误 - 1) 数组名称和使用left
的拼写错误 2) 索引 的“差一错误”
for (int j = 0; j < rightArrayLength; j++)
{
right[j] = arr[midIndex + 1 + j];
}