高效率的排序算法2--归并排序

速度仅次于快速排序,而且排序稳定的就是你了--归并排序,不过实现起来比快排要略复杂。

归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。

为了让二组有序,可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

为了方便当做模板套用,我把if和while循环后面都加了大括号

代码如下:

//本次编写的为按从大到小的顺序 
#include <iostream>
#include <cstdio>
using namespace std;
int a[1000],temp[1000];//大小自己根据题目要求来改 
void mergearray(int a[],int temp[],int first,int mid,int last){
    int i=first, mm=mid;//将a数组分成两部分,i到mm位前半部分,j到nn为后半部分 
    int j=mid+1, nn=last;
    int k=0;//k为中间数组的下标 
    while(i<=mm&&j<=nn){
        if(a[i]>=a[j]){
            temp[k++]=a[i++];
        }
        else{
            temp[k++]=a[j++];
        }
    }
    while(i<=mm){
        temp[k++]=a[i++];
    }
    while(j<=nn){
        temp[k++]=a[j++];
    }
    //接下来别忘记了起始点是first 
    for(int i=0;i<k;i++)    a[first+i]=temp[i];//再把中间数组的值赋回原数组 
}
void mergesort(int a[],int first,int last,int temp[]){
    if(first<last)    {
    int mid=(first+last)/2;
    mergesort(a,first,mid,temp);//递归调用 
    mergesort(a,mid+1,last,temp);
    mergearray(a,temp,first,mid,last);
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    mergesort(a,0,n-1,temp); 
    for(int i=0;i<n;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;
}

 

posted @ 2018-07-25 16:28  清酒令  阅读(429)  评论(0编辑  收藏  举报