2017年計算機二級C++輔導編程:用C++實現(xiàn)合并排序

字號:


    用C++實現(xiàn)合并排序
    合并排序的思想:當只有一個元素時終止排序,超過一個元素的話,將所有元素分成大致相同的兩個集合,分別對兩個集合進行排序,最后將排好序的子集合合并為所要求的排好序的集合。
    在最壞情況下,時間復雜度為O(nlogn),它是一個漸進的算法。
    #include
    #include
    //這個函數(shù)將b[0]至b[right-left+1]拷貝到a[left]至a[right]
    template
    void Copy(T a[],T b[],int left,int right)
    {
    int size=right-left+1;
    for(int i=0;i
    {
    a[left++]=b[i];
    }
    }
    //這個函數(shù)合并有序數(shù)組a[left:i],a[i+1:right]到b,得到新的有序數(shù)組b
    template
    void Merge(T a[],T b[],int left,int i,int right)
    {
    int a1cout=left,//指向第一個數(shù)組開頭
    a1end=i,//指向第一個數(shù)組結(jié)尾
    a2cout=i+1,//指向第二個數(shù)組開頭
    a2end=right,//指向第二個數(shù)組結(jié)尾
    bcout=0;//指向b中的元素
    for(int j=0;j
    {
    if(a1cout>a1end){b[bcout++]=a[a2cout++];continue;}//如果第一個數(shù)組結(jié)束,拷貝第二個數(shù)組的元素到b
    if(a2cout>a2end){b[bcout++]=a[a1cout++];continue;}//如果第二個數(shù)組結(jié)束,拷貝第一個數(shù)組的元素到b
    if(a[a1cout]
    else
    {b[bcout++]=a[a2cout++];continue;}
    }
    }
    //對數(shù)組a[left:right]進行合并排序
    template
    void MergeSort(T a[],int left,int right)
    {
    T *b=new int[right-left+1];
    if(left
    int i=(left+right)/2;//取中點
    MergeSort(a,left,i);//左半邊進行合并排序
    MergeSort(a,i+1,right);//右半邊進行合并排序
    Merge(a,b,left,i,right);//左右合并到b中
    Copy(a,b,left,right);//從b拷貝回來
    }
    }
    //from
    int main()
    {
    int n;
    cout<<"how many numbers to sort:";
    cin>>n;
    int *a=new int[n];
    cout<<"input "<
    for(int i=0;i
    {cin>>a[i];}
    MergeSort( a, 0, n-1);
    for(int j=0;j
    {
    cout<
    }
    return 1;
    }