算法导论-归并排序

来源:互联网 发布:初中网络课程哪家好 编辑:程序博客网 时间:2024/05/30 05:21
#include <iostream>#define MAXNUM 100000using namespace std;int A[]={2,4,5,7,1,2,3,6};//需要被排序的数组//int A[]={4,41,52,26,38,57,9,49};//需要被排序的数组void printA(){    for(int i = 0;i<sizeof(A)/ sizeof(int);i++)    {        cout<<A[i]<<"  ";    }    cout<<endl;}void Merge(int beg,int mid,int end)//该归并排序将会加入哨兵,避免检查有一个数组已排序完毕。{    int n1 = mid-beg+1;//左边需要排序的数的个数    int n2 = end-mid;//右边需要排序的数的个数    int* A_L = new int[n1+1];//增加一个1用来存放哨兵    int* A_R = new int[n2+1];    for(int i = 0;i<n1;i++)    {        A_L[i] = A[i+beg];    }    for(int i = 0;i<n2;i++)    {        A_R[i] = A[i+mid+1];    }    A_L[n1] = MAXNUM;    A_R[n2] = MAXNUM;    int i = 0;    int j = 0;    for(int k = beg;k<=end;k++)    {        if(A_L[i]<=A_R[j])        {            A[k] = A_L[i];            i++;        }        else        {            A[k] = A_R[j];            j++;        }    }    delete[] A_L;    delete[] A_R;}void Merge_sort(int beg,int end)//beg为开始排序的位置,end为排序的最后一个元素的位置{    if(beg>=end) return ;//当只有一个元素的时候不需要排序    int mid = (beg+end)/2;    Merge_sort(beg,mid);//分别对左边和右边排序,排序的目标是数组A    Merge_sort(mid+1,end);    Merge(beg,mid,end);//将排好序的左边和右边的数组进行合并}int main(){    Merge_sort(0, sizeof(A)/ sizeof(int)-1);    printA();}

递归过程:

注意点:

在归并时,程序加入哨兵,这样就不用判断归并的堆是否为空。归并结束的条件是被归并的元素个数是希望被排序的数组长度。

数组 {7,5,4,2,6,3,2,1} 的排序过程是

5  7  4  2  6  3  2  1  
5  7  2  4  6  3  2  1  
2  4  5  7  6  3  2  1  
2  4  5  7  3  6  2  1  
2  4  5  7  3  6  1  2  
2  4  5  7  1  2  3  6  
1  2  2  3  4  5  6  7 

不加哨兵方法:

#include <iostream>using namespace std;int A[]={7,5,4,2,6,3,2,1};//需要被排序的数组//int A[]={4,41,52,26,38,57,9,49};//需要被排序的数组void printA(){    for(int i = 0;i<sizeof(A)/ sizeof(int);i++)    {        cout<<A[i]<<"  ";    }    cout<<endl;}void Merge(int beg,int mid,int end)//该归并排序将会加入哨兵,避免检查有一个数组已排序完毕。{    int n1 = mid-beg+1;//左边需要排序的数的个数    int n2 = end-mid;//右边需要排序的数的个数    int* A_L = new int[n1];//增加一个1用来存放哨兵    int* A_R = new int[n2];    for(int i = 0;i<n1;i++)    {        A_L[i] = A[i+beg];    }    for(int i = 0;i<n2;i++)    {        A_R[i] = A[i+mid+1];    }    int i = 0;    int j = 0;    int k = beg;    while(i<n1 && j<n2)    {        if(A_L[i]<=A_R[j])        {            A[k++] = A_L[i];            i++;        }        else        {            A[k++] = A_R[j];            j++;        }    }    if(i!=n1)    {        while(i<n1)        {            A[k++] = A_L[i++];        }    }    else if(j!=n2)    {        while(j<n2)        {            A[k++] = A_R[j++];        }    }    delete[] A_L;    delete[] A_R;}void Merge_sort(int beg,int end)//beg为开始排序的位置,end为排序的最后一个元素的位置{    if(beg>=end) return ;//当只有一个元素的时候不需要排序    int mid = (beg+end)/2;    Merge_sort(beg,mid);//分别对左边和右边排序,排序的目标是数组A    Merge_sort(mid+1,end);    Merge(beg,mid,end);//将排好序的左边和右边的数组进行合并}int main(){    Merge_sort(0, sizeof(A)/ sizeof(int)-1);    printA();}


1 0
原创粉丝点击