归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。
如 设有数列{6,202,100,301,38,8,1}
初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数
i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3
i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4
i=3 [ 1 6 8 38 100 202 301 ] 4
总计: 11次
实现的代码如下:
1 #include <iostream> 2 using namespace std; 3 4 //将2个有序数组a[first...mid]和a[mid+1...last]数组和合并 5 void mergearray(int a[], int first, int mid, int last, int temp[]){ 6 int i = first, j = mid + 1; 7 int m = mid, n = last; 8 int k = 0; 9 10 //通过循环将2个数组比较后有序的放入到临时数组temp中 11 while (i <= m && j <= n) { 12 if (a[i] <= a[j]) { 13 temp[k++] = a[i++]; 14 } 15 else { 16 temp[k++] = a[j++]; 17 } 18 } 19 while (i <= m) { 20 temp[k++] = a[i++]; 21 } 22 while (j <= n) { 23 temp[k++] = a[j++]; 24 } 25 //将排好序的临时数组重新放置到原数组a中 26 for (i = 0; i < k; i++) { 27 a[first + i] = temp[i]; 28 } 29 } 30 31 //使用递归将数组a变成若干有序的小的数组 32 void mergesort(int a[], int first, int last, int temp[]) 33 { 34 if (first < last) 35 { 36 int mid = (first + last) / 2; 37 mergesort(a, first, mid, temp); //左边有序 38 mergesort(a, mid + 1, last, temp);//右边有序 39 mergearray(a, first, mid, last, temp); 40 } 41 } 42 43 //使用归并排序 44 bool MergSort(int a[], int n) 45 { 46 int *p = new int[n]; 47 if (p == NULL) return false; 48 mergesort(a, 0, n - 1, p); 49 delete[] p; 50 return true; 51 } 52 53 int main(int argc, const char * argv[]) 54 { 55 system("color 5F"); 56 57 int a[10] = { 2, 1, 3, 7, 106, 8, 9, 5, 4, 76 }; 58 MergSort(a, 10); 59 for (int i = 0; i < 10; i++){ 60 cout << a[i] << endl; 61 } 62 63 system("pause"); 64 return 0; 65 }