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

    归并排序重点在治,即合并两个有序数组:

     1 void merge(int A[], int p, int q, int r)
     2 {
     3     int i = 0, j = 0, k = p;
     4     int m = q - p + 1;
     5     int n = r - q;
     6     int *S = new int[m];
     7     int *T = new int[n];
     8     for (i = 0; i < m; i++)
     9         S[i] = A[p + i]; 
    10     for (j = 0; j < n; j++)
    11         T[j] = A[q + j + 1]; 
    12 
    13     i = j = 0;
    14     while ((i < m) && (j < n)) 
    15         if (S[i] < T[j])
    16             A[k++] = S[i++];
    17         else
    18             A[k++] = T[j++];
    19     while (i < m)
    20         A[k++] = S[i++];
    21     while (j < n)
    22         A[k++] = T[j++];
    23     
    24     delete[] S;
    25     delete[] T;
    26 }

    有了merge函数,就可以使用up-down的方式分治,使用递归解决。

    void merge_sort(int A[], int p, int r)
    {
        int q;
        if (p < r)
        {
            q = (p + r) / 2;
            merge_sort(A, p, q);
            merge_sort(A, q + 1, r);
            merge(A, p, q, r);
        }
    }

     或者采用bottom-up的方法,非递归解决。

     1 void merge_sort(int A[], int p, int r)
     2 {
     3     int step, low, mid, high;
     4 
     5     for (step = 1; step <= r; step *= 2)
     6     {   
     7         low = p;
     8         while (low + step <= r)
     9         {   
    10             mid = low + step - 1;
    11             high = mid + step;
    12             if (high >= r)
    13                 high = r;
    14             merge(A, low, mid, high);
    15             low = high + 1;
    16         }   
    17     }   
    18 }
  • 相关阅读:
    POJ:1703-Find them, Catch them(并查集好题)(种类并查集)
    POJ:2236-Wireless Network
    POJ:2010-Moo University
    POJ :3614-Sunscreen
    POJ:2395-Out of Hay
    Aizu:2224-Save your cats
    POJ:2377-Bad Cowtractors
    CSS属性大全
    博客园背景设置CSS代码
    W3C标准以及规范
  • 原文地址:https://www.cnblogs.com/ym65536/p/4079556.html
Copyright © 2011-2022 走看看