速度仅次于快速排序,而且排序稳定的就是你了--归并排序,不过实现起来比快排要略复杂。
归并排序,其的基本思路就是将数组分成二组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; }