码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序

时间:2015-02-16 00:22:14      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:

归并排序(Merge sort)是创建在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

技术分享

算法描述:

  1. 将待排序数据分为两部分(递归调用归并排序)。
  2. 对两部分数据进行归并操作。

 

时间复杂度:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!