排序算法之归并排序
归并排序是一个稳定且高速的排序算法,同快速排序一样,时间复杂度为O(nlogn)。
这个算法非常好用,这里先给出代码.
1 #include<iostream> 2 using namespace std; 3 4 int a[100],cp[100]; 5 void Msort(int l, int r)//Merge sort缩写 6 { 7 if(r==l) return; 8 int mid=(l+r)/2; 9 Msort(l,mid); 10 Msort(mid+1,r); 11 int i=l,j=mid+1; 12 int k=l; 13 while(i<=mid&&j<=r) 14 { 15 if(a[i]>a[j]) { 16 cp[k++]=a[j]; ++j; 17 } else if(a[i]<a[j]) { 18 cp[k++]=a[i]; ++i; 19 } else { 20 cp[k++]=a[i]; i++; 21 cp[k++]=a[j]; j++; 22 } 23 } 24 while(i<=mid) cp[k++]=a[i++]; 25 while(j<=r) cp[k++]=a[j++]; 26 for(int i=l;i<k;++i) a[i]=cp[i]; 27 return; 28 } 29 30 int main() 31 { 32 int n; 33 cin>>n; 34 for(int i=1;i<=n;i++) 35 cin>>a[i]; 36 Msort(1,n); 37 for(int i=1;i<=n;++i) 38 cout<<a[i]<<" "; 39 return 0; 40 }
归并排序是建立在分治算法上的排序操作。通过将多个有序序列合并,最终得到一个有序整体,这便是归并操作的思想。给出代码实现的便是将有序表两两合并,最终合成一个有序表的过程,该操作被称为二路归并。
归并算法可分为两个阶段,一个是分解,另一个则是合并,这里我们通过递归来实现。
第一步:二分整个序列,只到得到n个体后,终止递归。
第二步:合并每个有序表。在合并过程中我们比较两个有序表的每个元素,较小者存入辅助数组cp[],最后将两个有序表中的剩余元素进行处理,再把cp[]中的元素复制到a[]数组即可。但需要注意的是,cp[]数组的初始下标k与l必须同步,最后k的值一定为r+1,。
以上便是简单而强大归并排序,一定得灵活运用!