标签:
归并排序(Merge sort)是创建在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
算法描述:
时间复杂度:
T(N) = 2 * T(N/2) + cN
= 22 * T(N/22) + c2N
= 2k * T(N/2k) + ckN 其中N/2k = 1
= NT(1) + cNlogN
= O(NlogN)
归并示意图:
归并排序示意图:
伪代码:
1 MERGE(A, p, q, r)
2 n1 = q - p + 1
3 n2 = r - q
4 Let L[1..n1+1] and R[1..n2+1] be new arrays
5 for i = 1 to n1
6 L[i] = A[p+i-1]
7 for j = 1 to n2
8 R[j] = A[q+j]
9 L[n1+1] = ∞
10 R[n2+1] = ∞
11 i = j = 1
12 for k = p to r
13 if L[i] <= R[j]
14 A[k] = L[i]
15 i = i + 1
16 else
17 A[k] = R[j]
18 j = j + 1
19
20 MERGE-SORT(A, p, r)
21 if p < r
22 q = (p + r) / 2
23 MERGE-SORT(A, p, q)
24 MERGE-SORT(A, q+1, r)
25 MERGE(A, p, q, r)
代码详解:
1 #include <iostream> 2 #include <cstdio> 3 #include <climits> 4 5 #define N 8 6 7 using namespace std; 8 9 void merge(int[], int, int, int); 10 void mergeSort(int[], int, int); 11 void showData(int[], int); 12 13 int main() 14 { 15 int data[N] = {5, 2, 4, 7, 1, 3, 2, 6}; 16 17 showData(data, N); 18 mergeSort(data, 0, N-1); 19 showData(data, N); 20 21 return 0; 22 } 23 24 void merge(int arr[], int begin, int mid, int end) { 25 int i, j; 26 int lNum = mid - begin + 1; 27 int rNum = end - mid; 28 int left[lNum+1], right[rNum+1]; 29 30 for(i=0; i<lNum; i++) { 31 left[i] = arr[begin+i]; 32 } 33 left[lNum] = INT_MAX; 34 35 for(j=0; j<rNum; j++){ 36 right[j] = arr[mid+j+1]; 37 } 38 right[rNum] = INT_MAX; 39 40 i = j = 0; 41 42 for(int k=begin; k<=end; k++) { 43 if(left[i] < right[j]) { 44 arr[k] = left[i++]; 45 }else { 46 arr[k] = right[j++]; 47 } 48 } 49 } 50 51 void mergeSort(int arr[], int begin, int end) { 52 if(begin < end) { 53 int mid = (begin + end) / 2; 54 mergeSort(arr, begin, mid); 55 mergeSort(arr, mid+1, end); 56 merge(arr, begin, mid, end); 57 } 58 } 59 60 void showData(int arr[], int n) { 61 for(int i=0; i<n; i++) { 62 printf("%d ", arr[i]); 63 } 64 printf("\n"); 65 }
转载请注明出处:http://www.cnblogs.com/michaelwong/p/4293603.html
标签:
原文地址:http://www.cnblogs.com/michaelwong/p/4293603.html