几种常用的排序方法4--归并排序
2012-11-21 13:23
183 查看
归并排序
归并排序,又称为合并排序,它是把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。
使用的D&C的思想:
分解:将n个元素分解为各含n/2个元素的子序列;
解决:用合并排序法对两个子序列进行递归的排序;
合并:合并两个已经排好的子序列以得到正确结果。
归并排序的速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。其最好,最坏,平均时间复杂度都是O(nlogn)。
归并排序,又称为合并排序,它是把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。
使用的D&C的思想:
分解:将n个元素分解为各含n/2个元素的子序列;
解决:用合并排序法对两个子序列进行递归的排序;
合并:合并两个已经排好的子序列以得到正确结果。
归并排序的速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。其最好,最坏,平均时间复杂度都是O(nlogn)。
void Merge(int A[], int p, int q, int r)//对两个已经排好序的子数列进行合并 { int n1 = q - p + 1;//第一个子数列长度 int n2 = r - q; //第二个子数列长度 int L[n1+1], R[n2+1]; //左右两个子数列 for(int i = 1; i <= n1; i++) { L[i] = A[p+i-1]; //初始化 } for(int j = 1; j <= n2; j++) { R[j] = A[q+j]; //初始化 } L[n1+1] = MAXN;//哨兵值,前面定义MAXN为一个很大的数 R[n2+1] = MAXN;//使用这个哨兵值是为了避免检查每个子序列是不是空的。所有的数都不会比它大 int i = 1; int j = 1; for(int k = p; k <= r; k++)//有序的分别将小的数重新插入元序列中 { if(L[i]<= R[j]) { A[k] = L[i]; i = i + 1; } else { A[k] = R[j]; j = j + 1; } } } void Merge_Sort(int A[], int p, int r) { if(p < r) { int q = (int)((p+r)/2); //折半分解序列 Merge_Sort(A,p,q); //对左半部分进行归并排序 Merge_Sort(A,q+1,r); //对右半部分进行归并排序 Merge(A,p,q,r); } }
相关文章推荐
- C++实现几种常用的时间复杂度为O(nlogn)的排序方法:归并排序、快速排序、堆排序、希尔排序
- 基于C++语言实现的几种常用的排序方法小结(一)
- 【C#基础知识】之结构、数组及常用的几种排序方法总结
- java 运用数组常用的几种排序方法
- 几种常用排序方法的简单实现
- 几种常用的排序方法2--快速排序
- 几种常用的排序方法7--希尔排序
- 几种常用的排序方法
- 几种常用的排序方法。
- 几种常用的排序方法6--计数排序
- 二级c语言之常用的几种排序方法
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- 几种常用的C#排序方法简介
- 几种常用的排序方法3--选择排序
- java的几种常用排序方法集合
- 几种常用的排序方法5--堆排序
- 几种常用的排序方法
- 几种常用的排序方法
- OC中常用的数组排序有以下几种方法