几种常用的排序方法4--归并排序
归并排序
归并排序,又称为合并排序,它是把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。
使用的D&C的思想:
分解:将n个元素分解为各含n/2个元素的子序列;
解决:用合并排序法对两个子序列进行递归的排序;
合并:合并两个已经排好的子序列以得到正确结果。
归并排序的速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。其最好,最坏,平均时间复杂度都是O(nlogn)。
1 void Merge(int A[], int p, int q, int r)//对两个已经排好序的子数列进行合并 2 { 3 int n1 = q - p + 1;//第一个子数列长度 4 int n2 = r - q; //第二个子数列长度 5 int L[n1+1], R[n2+1]; //左右两个子数列 6 for(int i = 1; i <= n1; i++) 7 { 8 L[i] = A[p+i-1]; //初始化 9 } 10 for(int j = 1; j <= n2; j++) 11 { 12 R[j] = A[q+j]; //初始化 13 } 14 L[n1+1] = MAXN;//哨兵值,前面定义MAXN为一个很大的数 15 R[n2+1] = MAXN;//使用这个哨兵值是为了避免检查每个子序列是不是空的。所有的数都不会比它大 16 int i = 1; 17 int j = 1; 18 for(int k = p; k <= r; k++)//有序的分别将小的数重新插入元序列中 19 { 20 if(L[i]<= R[j]) 21 { 22 A[k] = L[i]; 23 i = i + 1; 24 } 25 else 26 { 27 A[k] = R[j]; 28 j = j + 1; 29 } 30 } 31 } 32 33 void Merge_Sort(int A[], int p, int r) 34 { 35 if(p < r) 36 { 37 int q = (int)((p+r)/2); //折半分解序列 38 Merge_Sort(A,p,q); //对左半部分进行归并排序 39 Merge_Sort(A,q+1,r); //对右半部分进行归并排序 40 Merge(A,p,q,r); 41 } 42 }