数据结构排序3--归并排序

归并排序思想
归并排序是“分治”算法之一,是利用归并的思想进行排序的。通常用的是二路归并。首先把元素两个归并,然后把归并后有序的在进行归并。“归”就是递归分解,首先把数组分解成一个一个的形式,这样再“并”。“并”就是讲分解后元素不断两组两组合并。
归并排序性能
时间复杂度:分解logn,合并n,因此是O(nlogn)
空间复杂度:利用一个数组,因此O(n)
稳定的排序
归并排序代码(C++)完整版

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
const int NUM = 100+5; 
int a[NUM],b[NUM];
//将有序数组a 和 b合并到c数组 
//void Merge(int a[],int n,int b[],int m,int c[],int len){
//  int i=0,j=0,k=0;
//  while(i<n && j<m){
//      if(a[i]<b[j])
//          c[k++]=a[i++];
//      else
//          c[k++]=b[j++];
//  }
//  
//  while(i<n)
//      c[k++]=a[i++];
//      
//  while(j<m)
//      c[k++]=b[j++];
//  for(int i=0;i<len;i++){
//      cout<<c[i]<<" ";
//  }
//} 
//将有二个有序数列a[first...mid]和a[mid...last]合并 
void Merge(int a[],int first,int mid,int last,int temp[]){
    int i= first, j = mid+1,k=0;
    int m = mid,n = last;
    while(i<=m && j<=n){
        if(a[i]<=a[j]){
            temp[k++]=a[i++];
        }
        else{
            temp[k++]=a[j++];
        }
    }
    while(i<=m){
        temp[k++]=a[i++];
    }
    while(j<=n){
        temp[k++]=a[j++];
    }
    for(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 = (last+first)/2;
        MergeSort(a,first,mid,temp);
        MergeSort(a,mid+1,last,temp);
        Merge(a,first,mid,last,temp);
    }
}
int main(int argc, char *argv[]) {
    int len;
    cin>>len;
    for(int i=0;i<len;i++){
        cin>>a[i];
    }
    MergeSort(a,0,len-1,b);
    for(int i=0;i<last;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值