归并排序

排序算法之归并排序

 归并排序是一个稳定且高速的排序算法,同快速排序一样,时间复杂度为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,。

  以上便是简单而强大归并排序,一定得灵活运用!

 

转载于:https://www.cnblogs.com/Beauty-of-wisdom/p/10060038.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值