【发布时间】:2016-03-12 13:06:15
【问题描述】:
我有一个数组,其中有 4 个已排序的部分。例如
int array[20] = {1,4,7,8,10,2,3,6,8,11,1,2,7,8,9,3,4,9,10,13}
我需要做的是对前 2 个排序部分(1,4,7,8,10 和 2,3,6,8,11)使用合并排序,然后对后 2 个排序部分(1,2, 7,8,9 和 3,4,9,10,13)。然后我需要将这 2 个排序部分合并到一个排序数组中。
我尝试使用这些代码,但出现了问题。
void Merge(int *array, int *aux, int left, int right)
{
int middleIndex = (left + right) / 2;
int leftIndex = left;
int rightIndex = middleIndex + 1;
int auxIndex = left;
while (leftIndex <= middleIndex && rightIndex <= right)
{
if (array[leftIndex] >= array[rightIndex])
{
aux[auxIndex] = array[leftIndex++];
}
else
{
aux[auxIndex] = array[rightIndex++];
}
auxIndex++;
}
while (leftIndex <= middleIndex)
{
aux[auxIndex] = array[leftIndex++];
auxIndex++;
}
while (rightIndex <= right)
{
aux[auxIndex] = array[rightIndex++];
auxIndex++;
}
}
知道如何修改它,或者写得更好吗?谢谢
【问题讨论】:
-
“但是出了点问题” - 如果您不告诉我们什么出了问题,我们将无法帮助您...
-
如何调用合并?您有四个范围,您可以一次合并其中两个,而不是四个。
-
通常只写一个归并排序算法(初始顺序无关紧要),但您是否尝试为这种特定情况编写算法?此外,你没有显示你如何调用你的函数。
-
尝试使用left = 0,right = 10 =第二个索引调用此代码。然后将
leftIndex <= middleIndex && rightIndex <= right替换为leftIndex < middleIndex && rightIndex < right。那么输出是什么? -
你知道排序范围的开始和结束的索引在哪里吗?如果是这样,那么使用
std::inplace_merge。