归并(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 // 2 // merge.cpp 3 // merge 4 // 5 // Created by scandy_yuan on 13-1-4. 6 // Copyright (c) 2013年 Sam. All rights reserved. 7 // 8 9 #include <iostream> 10 using namespace std; 11 12 //将2个有序数组a[first...mid]和a[mid+1...last]数组和合并 13 void mergearray(int a[],int first,int mid,int last, int temp[]){ 14 int i = first,j = mid+1; 15 int m = mid,n = last; 16 int k = 0; 17 18 //通过循环将2个数组比较后有序的放入到临时数组temp中 19 while (i<=m && j<=n) { 20 if (a[i] <= a[j]) { 21 temp[k++] = a[i++]; 22 } else { 23 temp[k++] = a[j++]; 24 } 25 } 26 while (i<=m) { 27 temp[k++] = a[i++]; 28 } 29 while (j<=n) { 30 temp[k++] = a[j++]; 31 } 32 //将排好序的临时数组重新放置到原数组a中 33 for (i=0;i<k;i++) { 34 a[first+i] = temp[i]; 35 } 36 } 37 38 //使用递归将数组a变成若干有序的小的数组 39 void mergesort(int a[],int first,int last,int temp[]) 40 { 41 if(first < last) 42 { 43 int mid = (first+last)/2; 44 mergesort(a, first, mid, temp); //左边有序 45 mergesort(a, mid+1, last, temp);//右边有序 46 mergearray(a, first, mid, last, temp); 47 } 48 } 49 50 //使用归并排序 51 bool MergSort(int a[],int n) 52 { 53 int *p = new int[n]; 54 if(p==NULL) return false; 55 mergesort(a, 0, n-1, p); 56 delete [] p; 57 return true; 58 } 59 60 int main(int argc, const char * argv[]) 61 { 62 63 // insert code here... 64 int a[10] = {2,1,3,7,6,8,9,5,4,0}; 65 MergSort(a, 10); 66 for(int i=0;i<10;i++){ 67 cout << a[i] << endl; 68 } 69 return 0; 70 }