归并排序
2015-09-06 18:26
183 查看
一、归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并
二、归并操作
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
三、算法性能
时间复杂度:平均、最差、最好情况下都是
空间复杂度:O(n)
稳定性:稳定
四、归并排序和堆排序、快速排序的比较
若从空间复杂度来考虑:首选堆排序,其次是快速排序,最后是归并排序。
若从稳定性来考虑,应选取归并排序,因为堆排序和快速排序都是不稳定的。
若从平均情况下的排序速度考虑,应该选择快速排序。
五、C++代码
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并
二、归并操作
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
三、算法性能
时间复杂度:平均、最差、最好情况下都是
空间复杂度:O(n)
稳定性:稳定
四、归并排序和堆排序、快速排序的比较
若从空间复杂度来考虑:首选堆排序,其次是快速排序,最后是归并排序。
若从稳定性来考虑,应选取归并排序,因为堆排序和快速排序都是不稳定的。
若从平均情况下的排序速度考虑,应该选择快速排序。
五、C++代码
#include<iostream> using namespace std; //将有二个有序数列a[first...mid]和a[mid...last]合并。 void mergearray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= m) temp[k++] = a[i++]; while (j <= n) temp[k++] = a[j++]; for (i = 0; i < k; i++) a[first + i] = temp[i]; } void mergesort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last) / 2; mergesort(a, first, mid, temp); //左边有序 mergesort(a, mid + 1, last, temp); //右边有序 mergearray(a, first, mid, last, temp); //再将二个有序数列合并 } } int main() { int arr[]={4,5,7,2,8,3,9,3,1,6}; int *p = new int[10]; mergesort(arr,0,10,p); for(int i=0; i<10; i++) { cout<<arr[i]<<" "; } delete []p; cout<<endl; return 0; }
相关文章推荐
- php preg_match_all 和 str_replace 替换图片链接
- 黑马程序员---网络编程(TCP传输 二)
- mysql主从
- Effective STL: 使用swap来修整过剩容量
- hadoop eyes开发进度
- ios 转json字符串
- C#设置IE代理
- 更新日志 - fir.im 回归,上线 Android Studio 插件
- List Set Map
- Java IO学习总结
- apache+php安装(centos6.5)
- 动态规划
- MySQL学习笔记—基本操作汇总
- 指定时间执行任务
- MySQL字符集问题
- Android读取assets目录下文件数据内容
- android中Handler中的obtainMessage()
- linux权限
- Eclipse快捷键大全
- 建立自己的客户关系网