• 数据结构之——归并排序


    归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
    归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
      将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
      归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。
      如 设有数列{6,202,100,301,38,8,1}
      初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数
      i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3
      i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4
      i=3 [ 1 6 8 38 100 202 301 ] 4
      总计: 11次

    实现的代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 //将2个有序数组a[first...mid]和a[mid+1...last]数组和合并
     5 void mergearray(int a[], int first, int mid, int last, int temp[]){
     6     int i = first, j = mid + 1;
     7     int m = mid, n = last;
     8     int k = 0;
     9 
    10     //通过循环将2个数组比较后有序的放入到临时数组temp中
    11     while (i <= m && j <= n) {
    12         if (a[i] <= a[j]) {
    13             temp[k++] = a[i++];
    14         }
    15         else {
    16             temp[k++] = a[j++];
    17         }
    18     }
    19     while (i <= m) {
    20         temp[k++] = a[i++];
    21     }
    22     while (j <= n) {
    23         temp[k++] = a[j++];
    24     }
    25     //将排好序的临时数组重新放置到原数组a中
    26     for (i = 0; i < k; i++) {
    27         a[first + i] = temp[i];
    28     }
    29 }
    30 
    31 //使用递归将数组a变成若干有序的小的数组
    32 void mergesort(int a[], int first, int last, int temp[])
    33 {
    34     if (first < last)
    35     {
    36         int mid = (first + last) / 2;
    37         mergesort(a, first, mid, temp); //左边有序
    38         mergesort(a, mid + 1, last, temp);//右边有序
    39         mergearray(a, first, mid, last, temp);
    40     }
    41 }
    42 
    43 //使用归并排序
    44 bool MergSort(int a[], int n)
    45 {
    46     int *p = new int[n];
    47     if (p == NULL) return false;
    48     mergesort(a, 0, n - 1, p);
    49     delete[] p;
    50     return true;
    51 }
    52 
    53 int main(int argc, const char * argv[])
    54 {
    55     system("color 5F");
    56 
    57     int a[10] = { 2, 1, 3, 7, 106, 8, 9, 5, 4, 76 };
    58     MergSort(a, 10);
    59     for (int i = 0; i < 10; i++){
    60         cout << a[i] << endl;
    61     }
    62 
    63     system("pause");
    64     return 0;
    65 }
  • 相关阅读:
    空格转换
    vuex学习
    css移动端适配方法
    数组以及数组常用方法
    21-canvas事件监听
    20-canvas之形变
    [转]session 跨域共享方案
    [转载] 从mysql,代码,服务器三个方面看mysql性能优化
    [计算机]Alan Perlis人物简介
    Python环境搭建及pip的使用
  • 原文地址:https://www.cnblogs.com/zhiyinglky/p/4810448.html
Copyright © 2020-2023  润新知