在C ++中合并排序实现

时间:2014-06-11 13:56:21

标签: c++ mergesort

#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循环)。 我尝试运行没有标记部分的代码,它显然显示错误的答案,但我无法推断它为什么会发生?

谢谢!

3 个答案:

答案 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语句和循环的用途。