zoukankan      html  css  js  c++  java
  • 归并排序

    归并排序(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("
    ");
    65 }

    转载请注明出处http://www.cnblogs.com/michaelwong/p/4293603.html

  • 相关阅读:
    day30---多态与鸭子类型
    day---30 Mixins机制与重用父类功能的两种方式
    day29---面向对象编程之继承
    day---28 作业
    day28---面向对象之封装
    day27----作业
    day---27面向对象编程与类
    day26---ATM+购物车
    day25---软件设计的3层架构
    day24---RE模块部分整理
  • 原文地址:https://www.cnblogs.com/michaelwong/p/4293603.html
Copyright © 2011-2022 走看看