zoukankan      html  css  js  c++  java
  • 《算法导论》CLRS算法C++实现(二)P17 归并排序

    第二章 算法入门

    两个有序数组的合并

    这个算法我的实现跟算法导论上的实现有些许区别。我没有使用《算法导论》上的哨兵位的方法。而且直接判断有没有到数组的末尾。不过为了跟书上保持一致,我的伪代码还是使用算法导论上的伪代码。

    算法描述:

    MERGE(A, p, q, r)是把存储在A[p...q]和A[q+1...r]这两部分中的有序子序列合并到A[p...r]并使其有序。

    两个子数组的长度分别为int n1=q-p+1; int n2=r-q; 建立两个新数组L和R,用于分别存放原数组的两个有序部分。分别遍历两个新的数组L和R,依次比较其中元素,将其中较小的元素存放到原数组A的对应位置。L和R中任何一个数组遍历结束后,将另一个数组的剩余部分复制到原数组A的后面位置。至此算法完成。

    伪代码实现

    MERGE(A, p, q, r)  《算法导论》P17

     1 n1 ← q - p + 1
     2 n2 ← r - q
     3 create arrays L[1 ‥ n1 + 1] and R[1 ‥ n2 + 1]
     4 for i ← 1 to n1
     5     do L[i] ← A[p + i - 1]
     6 for j ← 1 to n2
     7     do R[j] ← A[q + j]
     8 L[n1 + 1] ← ∞
     9 R[n2 + 1] ← ∞
    10 i ← 1
    11 j ← 1
    12 for k ← p to r
    13     do if L[i] ≤ R[j]
    14         then A[k] ← L[i]
    15             i ← i + 1
    16         else A[k] ← R[j]
    17             j ← j + 1

    MERGE-SORT(A, p, r)  《算法导论》 P19

    1 if p < r
    2     then q ← floor((p + r)/2)
    3         MERGE-SORT(A, p, q)
    4         MERGE-SORT(A, q + 1, r)
    5         MERGE(A, p, q, r)

    C++代码实现

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 void merge(int*arr, int p, int q, int r)
     6 {
     7     int n1 = q - p + 1;
     8     int n2 = r - q;
     9 
    10     int* L = new int[n1];
    11     int* R = new int[n2];
    12 
    13     for(int i = 0; i < n1; i++)
    14     {
    15         L[i] = arr[p + i];
    16     }
    17     for(int j = 0; j < n2; j++)
    18     {
    19         R[j] = arr[q + j + 1];
    20     }
    21 
    22     int i = 0;
    23     int j = 0;
    24     int k = p;
    25 
    26     while((i < n1) && (j < n2))
    27     {
    28         if(L[i] <= R[j])
    29         {
    30             arr[k] = L[i];
    31             i++;
    32         }
    33         else
    34         {
    35             arr[k] = R[j];
    36             j++;
    37         }
    38         k++;
    39     }
    40 
    41     if (i < n1)
    42     {
    43         for(; i < n1; i++, k++)
    44         {
    45             arr[k] = L[i];
    46         }
    47     }
    48     if (j < n2)
    49     {
    50         for(; j < n2; j++, k++)
    51         {
    52             arr[k] = R[j];
    53         }
    54     }
    55 }
    56 
    57 void mergesort(int* arr, int p, int r)
    58 {
    59     int q = 0;
    60     if(p < r)
    61     {
    62         q = (p + r) / 2;
    63         mergesort(arr, p, q);
    64         mergesort(arr, q + 1, r);
    65         merge(arr, p, q, r);
    66     }
    67 }
    68 
    69 int main()
    70 {
    71     int a[] = {2, 45, 5, 7, 34, 456, 345, 89, 8, 1, 341, 4, 98, 67};
    72     mergesort(a, 0, 13);
    73     for(int i = 0; i < 14; i++)
    74     {
    75         cout << a[i] << " ";
    76     }
    77     cout << endl;
    78     return 0;
    79 }
  • 相关阅读:
    Sum Root to Leaf Numbers 解答
    459. Repeated Substring Pattern
    71. Simplify Path
    89. Gray Code
    73. Set Matrix Zeroes
    297. Serialize and Deserialize Binary Tree
    449. Serialize and Deserialize BST
    451. Sort Characters By Frequency
    165. Compare Version Numbers
    447. Number of Boomerangs
  • 原文地址:https://www.cnblogs.com/juventus/p/2532006.html
Copyright © 2011-2022 走看看