个人对归并排序的理解
1.也是分治法
2.先拆分,拆分总序列, (先不考虑奇数)
第一次拆分为N个子序列, 每个子序列元素有1个,俩俩合并子序列
第二次拆分为N/2子序列,每个子序列元素有2个, 俩俩合并子序列
第三次拆分为N/4子序列,每个子序列元素有4个,俩俩合并子序列
----------n/2^n ------------------ 2^n
...最后拆分为2个子序列,每个子序列元素有N/2个,俩俩合并子序列,成为新的有序序列
3.因为拆分的子序列都是有序的,合并速度非常快。归并效率很高
时间复杂度
平均速度 O(N*logN)
稳定排序
#include <iostream>
using namespace std;
void print(int a[], int n){
for(int j= 0; j<n; j++){
cout<<a[j] <<" ";
}
cout<<endl;
}
//将r[i…m]和r[m +1 …n]归并到辅助数组rf[i…n]
void Merge(int *r,int *rf, int i, int m, int n)
{
int j,k;
for(k=i,j=m+1; i<=m && j <=n ; ++k){
if(r[j] < r[i]) rf[k] = r[j++];
else rf[k] = r[i++];
}
while(i <= m) rf[k++] = r[i++];
while(j <= n) rf[k++] = r[j++];
// print(rf,n+1);
}
void MergeSort(int *r, int *rf, int lenght)
{
int len = 1;
int *q = r ;
int *tmp ;
while(len < lenght) {
len = 2 * len ;
int i = 0;
while(i+ len <lenght) {
Merge(q, rf, i, i+ len/2 -1, i+ len-1 ); //对等长的两个子表合并
i = i+ len;
}
if(i + len/2 < lenght+1){ // 这里要+1
Merge(q, rf, i, i+ len/2 -1, lenght -1); //对不等长的两个子表合并
}
tmp = q; q = rf; rf = tmp; //交换q,rf,以保证下一趟归并时,仍从q 归并到rf
}
}
int main(){
int a[19] = {3,1,5,7,2,4,9,6,8,0,20,3,5,6,7,-1,-1,-2,0};
int b[19];
MergeSort(a, b,19);
cout<<"结果:";
print(b,19);
}
-
看我那么可爱n(≧▽≦)n
- 关注我的微薄 (梁同桌):http://weibo.com/tongrenyinsheng
- 个人博客: http://www.liangtongzhuo.com
- ios 个人写的app (同人音声)ASMR音乐