【mergeSort】
2016-03-02 17:08
260 查看
详细解释:http://blog.csdn.net/yinjiabin/article/details/8265827
一张图诠释归并排序!!!
代码:
总结:
1. 归并排序的时间复杂度为O(nlgn), 空间复杂度为O(n)
2. 归并排序属于稳定排序,即排序前后相等元素的先后顺序不变,这是在O(nlgn)系列算法中(比如快速排序)少有的稳定排序算法
3. 在计算mid = (low + high) / 2时,如果low和high很大,则可能发生溢出,可将式子转换为mid = low + (high - low) / 2
4. 书上伪代码是在每次merge时分配临时空间,这样多次分配释放会影响效率,可以预先分配O(n)的空间作为参数传给merge函数
一张图诠释归并排序!!!
代码:
#include<iostream> #include<stdlib.h> using namespace std; void mergeArray(int *a,int l,int mid,int r) { int i=l,j=mid+1,k=0; int *p; p=(int*)malloc((r-l+1)*sizeof(int)); while(i<=l&&j<=r){ if(a[i]<=a[j]) p[k++]=a[i++]; else p[k++]=a[j++];// 在这里可以计算逆序数对的个数; } while(i<=mid) p[k++]=a[i++]; while(j<=r) p[k++]=a[j++]; j=0; for(i=l;i<=r;i++) a[i]=p[j++]; free(p); } void mergeSort(int *a,int l,int r) { if(l<r){ int mid=(l+r)>>1; mergeSort(a,l,mid); mergeSort(a,mid+1,r); mergeArray(a,l,mid,r); } } int main() { int a[]={9,8,7,6,5,4,3,2,1,0}; mergeSort(a,0,sizeof(a)/sizeof(a[0])); for(int i=0;i<10;i++) cout<<a[i]<<' '; return 0; }
总结:
1. 归并排序的时间复杂度为O(nlgn), 空间复杂度为O(n)
2. 归并排序属于稳定排序,即排序前后相等元素的先后顺序不变,这是在O(nlgn)系列算法中(比如快速排序)少有的稳定排序算法
3. 在计算mid = (low + high) / 2时,如果low和high很大,则可能发生溢出,可将式子转换为mid = low + (high - low) / 2
4. 书上伪代码是在每次merge时分配临时空间,这样多次分配释放会影响效率,可以预先分配O(n)的空间作为参数传给merge函数
相关文章推荐
- Python-----sorted
- 如何设置mac虚拟机中的语言
- java5中的 Map 与线程安全
- MapGIS6.7_学习中遇到的问题记录下来(1)
- 性能测试培训:Ajax接口级性能测试之jmeter版
- [bzoj2324][ZJOI2011]营救皮卡丘
- 基于Nginx服务器和iOS9的HTTPS安全通信
- windows下安装redis
- poj--3164(次小生成树)
- 性能测试(二):性能测试的分析步骤
- C++调用lib或dll文件
- 【电脑关机后,电源指示灯仍然亮着!】
- js 搜索关键字,文章中关键字高亮显示
- 基于Nginx服务器和iOS9的HTTPS安全通信
- 二叉树的简单操作
- Intent获取值的时候空指针错误
- SSL协议详解
- Linux信号(signal)
- 发布网页乱码
- Qt lupdate 和 lrealease 命令行使用方式(多语言)