zoukankan      html  css  js  c++  java
  • 归并排序【代码】

    思路参考:

    《算法导论》第三版P17

    代码如下:

     1 // 171028归并排序.cpp: 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <iostream>
     6 #include <random>
     7 #include <memory>
     8 
     9 using namespace std;
    10 
    11 /*
    12 * 将一个数组中的两个相邻有序区间合并成一个
    13 *
    14 * 参数说明:
    15 *     a -- 包含两个有序区间的数组
    16 *     start -- 第1个有序区间的起始地址。
    17 *     mid   -- 第1个有序区间的结束地址。也是第2个有序区间的起始地址。
    18 *     end   -- 第2个有序区间的结束地址。
    19 */
    20 void merge(unsigned int a[], int start, int mid, int end)//按照升序排列
    21 {
    22     unsigned int *tmp = new unsigned int[(end - start + 1) * sizeof(unsigned int)] {0};    // tmp是汇总2个有序区的临时区域
    23     int i = start;            // 第1个有序区的索引
    24     int j = mid + 1;        // 第2个有序区的索引
    25     int k = 0;                // 临时区域的索引
    26 
    27     while (i <= mid && j <= end)
    28     {
    29         if (a[i] <= a[j])//如果按照降序排列则改成a[i] >= a[j]
    30             tmp[k++] = a[i++];
    31         else
    32             tmp[k++] = a[j++];
    33     }
    34 
    35     while (i <= mid)
    36         tmp[k++] = a[i++];
    37 
    38     while (j <= end)
    39         tmp[k++] = a[j++];
    40 
    41     // 将排序后的元素,全部都整合到数组a中。
    42     for (i = 0; i < k; i++)
    43         a[start + i] = tmp[i];
    44     delete tmp;
    45 }
    46 
    47 /*
    48 * 归并排序(从上往下)
    49 *
    50 * 参数说明:
    51 *     a -- 待排序的数组
    52 *     start -- 数组的起始地址
    53 *     endi -- 数组的结束地址
    54 */
    55 void merge_sort_up2down(unsigned int a[], int start, int end)
    56 {
    57     if (a == NULL || start >= end)
    58         return;
    59 
    60     int mid = (end + start) / 2;
    61     merge_sort_up2down(a, start, mid);    // 递归排序a[start...mid]
    62     merge_sort_up2down(a, mid + 1, end); // 递归排序a[mid+1...end]                                         
    63     merge(a, start, mid, end);          // a[start...mid] 和 a[mid...end]是两个有序空间,
    64                                        // 将它们排序成一个有序空间a[start...end]
    65 }
    66 
    67 int main()
    68 {
    69     default_random_engine e;
    70     uniform_int_distribution<unsigned> u(0, 100);
    71     unsigned int test[9] = { 1,4,6,9,7,2,8,5,3 };
    72     /*for (int i = 0; i < 20; i++)
    73     {
    74         test[i] = u(e);
    75     }*/
    76     cout << "排序之前的数组序列: ";
    77     for (auto c : test)
    78         cout << c << ends;
    79     cout << endl;
    80 
    81     merge_sort_up2down(test, 0, sizeof(test)/sizeof(test[0])-1);// 归并排序(从上往下)
    82     cout << "排序之前的数组序列: ";
    83     for (auto c : test)
    84         cout << c << ends;
    85     cout << endl;
    86     return 0;
    87 }
  • 相关阅读:
    深入浅出HTTP协议
    HTTP协议 URL
    HTTP Request
    HTTP 响应
    浅谈OpenStack架构
    Google云平台技术架构
    接口文档神器之apidoc
    .haccess 配置生效
    php namespace与use
    mysql 带条件的sum/count 使用技巧
  • 原文地址:https://www.cnblogs.com/njuxjx/p/7747816.html
Copyright © 2011-2022 走看看