归并排序思想
归并排序是“分治”算法之一,是利用归并的思想进行排序的。通常用的是二路归并。首先把元素两个归并,然后把归并后有序的在进行归并。“归”就是递归分解,首先把数组分解成一个一个的形式,这样再“并”。“并”就是讲分解后元素不断两组两组合并。
归并排序性能
时间复杂度:分解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;
}