10-排序-04-归并排序
2013-12-26 20:59
211 查看
归并排序
归并排序是将两个或两个以上的有序子表合并成一个新的有序表。
基本思想:
(1)将n个记录的待排序序列看成是有n个长度都为1的有序子表组成。(2)将两两相邻的子表归并为一个有序子表。
(3)重复上述步骤,直至归并为一个长度为n的有序表。
例:设初始关键字序列为:49 38 65 97 76 13 27 20
执行归并排序的过程如图所示:
算法:
void Merge (int low,int mm,int high) // 两个相邻有序段的合并 { RecType *R1; while(i<=mm&&j<=high) R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++]; while(i<=mm) R1[p++]=R[i++]; while(j<=high) R1[p++]=R[j++]; for(p=0,i=low;i<=high;p++,i++) R[i]=R1[p]; }
void MergePass(int length) // 完成一趟完整的合并 { for (i=1;i+2*length-1<=L;i=i+2*length) Merge(i,i+length-1,i+2*length-1); if (i+length-1<L) Merge(i,i+length-1,L); } void Mergesort() // 控制有序段的长度,每合并一趟,有序段长加倍 { for (length=1;length<L;length*=2) { MergePass(length); m++; } }
效率分析:
对n个元素的序列,执行二路归并算法,则必须做log2n趟归并,每一趟归并的时间复杂度是O(n),所以二路归并的时间复杂度为O(nlog2n)。两路归并排序需要和待排序序列一样多的辅助空间。其空间复杂度为O(n)。
两路归并排序也是一种稳定性的排序。
相关文章推荐
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——JAVA实现
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 常用排序算法——插入排序,快速排序,归并排序,堆排序,计数排序
- 排序——归并排序
- 转 搭建android 开发环境(ubuntu10。04LTS)
- 算法导论:插入排序和归并排序
- Python版插入排序,归并排序,快速排序
- 程序员面试题精选100题(10)-排序数组中和为给定值的两个数字[算法]
- 排序-归并排序
- 【数据结构之排序8】归并排序
- 面试珠玑 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 用归并排序实现单链表的排序
- 10-排序4 统计工龄
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 排序--5.归并排序
- 排序1+4:归并排序(MergeSort)和堆排序(HeapSort)
- 【排序】归并排序(递归和非递归版本)
- 【数据结构与算法】排序算法之五:归并排序
- 常见排序算法之归并排序
- 牛客练习赛10 B-栈和排序