【mergeSort】
来源:互联网 发布:自动随访系统 源码 编辑:程序博客网 时间:2024/05/16 15:57
详细解释: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函数
0 0
- MergeSort
- mergesort
- MergeSort
- mergesort
- mergesort
- Mergesort
- mergesort
- mergeSort
- mergeSort
- mergesort
- MergeSort
- MergeSort
- MergeSort
- MergeSort
- Mergesort
- Mergesort
- mergeSort
- mergesort
- 77.In the CUSTOMERS table, the CUST_CITY column contains the value 'Paris' for the
- Qt lupdate 和 lrealease 命令行使用方式(多语言)
- SSL协议详解
- try/catch/finally详解+示例
- eclipse tomcat maven 集成开发环境
- 【mergeSort】
- Intent获取值的时候空指针错误
- 24. Swap Nodes in Pairs
- 发布网页乱码
- [bzoj2324][ZJOI2011]营救皮卡丘
- 一个关于rm -rf 的教训
- windows下安装redis
- 计算两个时间差
- 性能测试(二):性能测试的分析步骤