




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、归并排序算法实现(迭代和递归)递归实现归并排序的原理如下:递归分割:34 23 12 55 66 4 2 99 1 45 77 88 99 534 23 12 55 66 4 299 1 45 77 88 99 534 23 12 5566 4 299 1 45 7788 99 534 2312 5566 4299 145 7788 995递归到达底部后排序返回:23 3412 554 6621 9945 7788 99512 23 34 552 4 661 45 77 9988 99 534 23 12 55 66 4 299 1 45 77 88 99 51 2 4 5 12 23 34
2、45 55 66 77 88 99 99最终实现排序:#include void merge(int *array, int low, int center, int high)if(low = high) return;int m = center - low + 1;int n = high - center;int Lm, Rn;for(int i=0; im; +i) Li = arraylow+i;for(int i=0; in; +i) Ri = arraylow+i+m;int i,j,k;for(i=0,j=0,k=low; im & j Rj)arrayk = Rj+;els
3、earrayk = Li+;while(im) arrayk+ = Li+;while(jn) arrayk+ = Rj+;void m_sort(int *array, int low, int high)int center;if(low high) center = (low + high)/2;m_sort(array, low, center);m_sort(array, center+1, high);merge(array, low, center, high);int main()int array = 23, 2, 45, 78, 1,99, 3;m_sort(array,
4、0, 6);for(int i=0; i=6; +i) printf(%dn, arrayi);return 0;时间复杂度:最坏和平均时间复杂度均为O(nlogn)空间复杂度:上面的实现有些问题,如果真如上面实现,在函数merge中都要使用辅助函 数Lm和Rn,那么归并了 logn层,每层消耗空间O(n),则实际消耗O(nlogn),再加上栈空间 的消耗O(longn),总的消耗为O(nlogn+logn).该算法不符合空间复杂度为O(n)的要求,所以需要 修改,实现如下:#include #include using std:string;void merge(int *array, in
5、t *extra, int low, int center, int high)memcpy(extra+low, array+low, (high-low+1)*sizeof(int);int i,j,k;for(i=low,j=(center+1),k=low; i=center & j extraj)arrayk = extraj+;elsearrayk = extrai+;while(i=center) arrayk+ = extrai+;while(j=high) arrayk+ = extraj+;void m_sort(int *array, int *extra, int lo
6、w, int high)int center;if(low high) center = (low + high)/2;m_sort(array, extra, low, center);m_sort(array, extra, center+1, high);merge(array, extra, low, center, high);int main()int array7 = 23, 2, 45, 78, 1,99, 3;int extra7;m_sort(array, extra, 0, 6);for(int i=0; i=6; +i) printf(%dn”, arrayi);ret
7、urn 0;空间复杂度:使用了辅助数组extra,消耗辅助空间O(n),加上栈空间的消耗O(logn),总 的空间复杂度为O(n+logn),如果n无限大,则空间复杂度可以简化为O(n)。归并排序的迭代实现的原理如下:34 2312 5566 42 991 4577 8899 523 3412 5566 42 991 4577 885 9912 23 34 552 4 66 991 45 77 885 992 4 12 23 34 55 66 991 5 45 77 77 991 2 4 5 12 23 34 45 55 66 77 88 99 99实现程序如下:#include #inclu
8、de using std:string;void merge(int *sort, int *list, int low, int center, int high)int i,j,k;for(i=low,j=(center+1),k=low; i=center & j listj)sortk = listj+;elsesortk = listi+;while(i=center) sortk+ = listi+;while(j=high) sortk+ = listj+;void merge_pass(int *a, int *b, int length, int n)int i;for(i=
9、0; i=n-2*length; i+=2*length) int center = (i + i + 2*length - 1)/2;merge(a, b, i, center, i+2*length-1);if(i+length)n) int center = (i + i + 2*length - 1)/2;merge(a, b, i, center, n-1); else while(in) ai = bi;+i;void m_sort(int *array, int n)int extran;int length = 1;while(length n) merge_pass(extra, array, length, n);length *= 2;merge_pass(array, extra, length, n);length *= 2;int main()int data = 34, 23, 12, 55, 66, 4, 2, 99, 1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论