二路归并排序,C++代码实现

  1. #include <iostream>  
  2. using namespace std;  
  3. typedef struct   
  4. {  
  5.     int r[100+1];  
  6.     int length;  
  7. }SqList;  
  8. //二路归并函数  
  9. void Merge(SqList &L,int low,int m,int high)  
  10. {//将两个有序区归并为一个有序区  
  11.     int i,j,k;  
  12.     i=low;//low为第一个有序区的第一个元素,i指向第一个元素  
  13.     j=m+1;//m为第一个有序区的最后一个元素,m+1为第二个有序区第一个元素,j指向第一个元素  
  14.     k=0;  
  15.     int *t=new int[high-low+1];//t数组用来暂存合并的有序序列  
  16.     if(!t)  
  17.     {  
  18.         cout<<"ERROR!";  
  19.         return;  
  20.     }  
  21.     while(i<=m&&j<=high)//顺序选取两个有序区的较小元素,存储到t数组中  
  22.         if(L.r[i]<=L.r[j])  
  23.             t[k++]=L.r[i++];  
  24.         else  
  25.             t[k++]=L.r[j++];  
  26.     while(i<=m)//若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中  
  27.         t[k++]=L.r[i++];  
  28.     while(j<=high)//同上  
  29.         t[k++]=L.r[j++];  
  30.     for(i=low,k=0;i<=high;i++,k++)  
  31.         L.r[i]=t[k];  
  32.     delete []t;  
  33. }  
  34. //用递归应用二路归并函数实现排序——分治法  
  35. void MergeSort(SqList &L,int low,int high)  
  36. {  
  37.     int mid;  
  38.     if(low<high)  
  39.     {  
  40.         mid=(low+high)/2;  
  41.         MergeSort(L,low,mid);  
  42.         MergeSort(L,mid+1,high);  
  43.         Merge(L,low,mid,high);  
  44.     }  
  45. }  
  46. void MSort(SqList &L)  
  47. {  
  48.     MergeSort(L,1,L.length);  
  49. }  
  50. void main()  
  51. {  
  52.     //freopen("in.txt","r",stdin);  
  53.     int i;  
  54.     SqList L;  
  55.     cin>>L.length;  
  56.     for(i=1;i<=L.length;i++)  
  57.         cin>>L.r[i];  
  58.     MSort(L);  
  59.     for(i=1;i<=L.length;i++)  
  60.         cout<<L.r[i]<<" ";  
  61. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值