#include <iostream>
using namespace std;
void merge(int*,int*,int,int,int);
void mergesort(int *a, int*b, int low, int high)
{
int pivot;
if(low<high)
{
pivot=(low+high)/2;
mergesort(a,b,low,pivot);
mergesort(a,b,pivot+1,high);
merge(a,b,low,pivot,high);
}
}
void merge(int *a, int *b, int low, int pivot, int high)
{
int h,i,j,k;
h=low;
i=low;
j=pivot+1;
while((h<=pivot)&&(j<=high))
{
if(a[h]<=a[j])
{
b[i]=a[h];
h++;
}
else
{
b[i]=a[j];
j++;
}
i++;
}
**if(h>pivot)
{
for(k=j; k<=high; k++)
{
b[i]=a[k];
i++;
}
}
else
{
for(k=h; k<=pivot; k++)
{
b[i]=a[k];
i++;
}
}**
for(k=low; k<=high; k++) a[k]=b[k];
}
int main()
{
int a[] = {12,10,43,23,-78,45,123,56,98,41,90,24};
int num;
num = sizeof(a)/sizeof(int);
int b[num];
mergesort(a,b,0,num-1);
for(int i=0; i<num; i++)
cout<<a[i]<<" ";
cout<<endl;
}
我无法理解此代码中的一件事。这在我的书中给出。 我跟踪了这段代码,了解如果我取8个未分类的数字会发生什么。
我们为什么要这样做? (开头和结尾有两颗星的部分)
if ( h > pivot )
{
......
}
else
{
......
}
它上面的while循环本身只会将排序后的元素(以及所有这些元素)放在数组b中。然后我们最终可以将它放在数组a中(通过最后一个for循环)。 我尝试运行没有标记部分的代码,它显然显示错误的答案,但我无法推断它为什么会发生?
谢谢!
答案 0 :(得分:1)
这部分代码将合并剩余的元素。例如,如果你有{3,4}和{1,2,6,7}
要合并,那么if(h>pivot)
条件之上的部分会给出{1,2,3,4}。
因此,为了复制休息元素,我们使用这个条件。
答案 1 :(得分:1)
这是在合并数组时,到达一个数组的末尾,这是复制另一个数组的其他元素,反之亦然。
答案 2 :(得分:0)
该部分用于存储剩余元素。 例如,如果我们有
A: 1, 3, 5, 4, 6, 7
B: empty
compare 1, 4
A: *1, 3, 5, 4, 6, 7
B: 1
compare 3,4
A: *1, *3, 5, 4, 6, 7
B: 1, 3
compare 5, 4
A: *1, *3, 5, *4, 6, 7
B: 1, 3, 4
compare 5, 6
A: *1, *3, *5, *4, 6, 7
B: 1,3,4,5
现在,虽然循环结束,因为A上半部分的计数器已越过枢轴。但是我们还没有完成,我们必须添加剩余的元素,这些元素在枢轴之后是剩余的元素,即6,7。这些我们可以简单地进入b,它们已经按照之前的合并调用进行了排序。这就是最后一个if语句和循环的用途。