zoukankan      html  css  js  c++  java
  • 各种排序总结(六)归并排序

     1 /****************
     2 思路:假设待排序有n个记录,将这n个记录看成n个有序的子序列,每个子序列长度为1,
     3 然后两两归并。
     4 如何将将二个有序数列合并:这个非常简单,只要从比较二个数列的第一个数,
     5 谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,
     6 那直接将另一个数列的数据依次取出即可。
     7 ****************/
     8 #include <iostream>
     9 
    10 using namespace std;
    11 
    12 //将有二个有序数列arr[first...mid]和arr[mid...last]合并。主要是merge这个函数
    13 void Merge(int* arr, int first, int mid, int last, int* temp)
    14 {
    15     int f1 = first;
    16     int m = mid;
    17     int f2 = mid+1;
    18     int l = last;
    19     int i = 0;
    20     while((f1 <= m)&&(f2 <= l))
    21     {
    22         if(arr[f1] < arr[f2])
    23             temp[i++] = arr[f1++];
    24         else
    25             temp[i++] = arr[f2++];
    26     }
    27     while(f1 <= m)
    28         temp[i++] = arr[f1++];
    29     while(f2 <= l)
    30         temp[i++] = arr[f2++];
    31     for(int j=0; j<i; j++)
    32         arr[first + j] = temp[j];
    33 }
    34 
    35 
    36 void MergeSort(int* arr, int first, int last, int* temp)
    37 {
    38     int mid;
    39     if(first < last)  //if first >= last, return
    40     {
    41         mid = (first + last) /2;
    42         MergeSort(arr, first, mid, temp);
    43         MergeSort(arr, mid+1, last, temp);
    44         Merge(arr,first, mid, last, temp);
    45     }
    46 }
    47 
    48 
    49 int main()
    50 {
    51     int * arr;
    52     int * temp;
    53     int n;
    54     cout<<"Input the arr length:"<<endl;
    55     cin>>n;
    56     arr = new int[n];
    57     temp = new int[n];
    58     cout<<"Input the arr elements:"<<endl;
    59     for(int i=0;i<n;i++)
    60     {
    61         cin>>arr[i];
    62     }
    63     MergeSort(arr,0,n-1,temp);
    64     cout<<"The outcome:"<<endl;
    65     for(int i=0;i<n;i++)
    66         cout<<arr[i]<<endl;
    67     return 0;
    68 }
    69 /************************
    70 稳定的。
    71 时间复杂度:归并排序不依赖与原始数组的输入情况,每次划分时两个子序列长度都是基本一样的,
    72             因此最大、最小和平均时间均为O(nlogn)。
    73 空间复杂度:用到一个临时数组,因此空间代价为O(n)。
    74 总结:
    75 1.排序时间不依赖于原始数组;
    76 2.时间为O(nlogn),因此适用于数组n较大的情况;
    77 3.空间代价为O(n)。
    78 *************************/
  • 相关阅读:
    周末郑州程序员朋友技术交流中的PPT
    WCF并发连接数的问题
    郑州.Net技术人员的招聘信息
    在路上
    Windows8体验(1)安装
    挖掘0day打进不同学校
    记一次绕过宝塔防火墙的BC站渗透
    一次实战中对tp5网站getshell方式的测试
    一次从弱口令到getshell
    一次HW实战
  • 原文地址:https://www.cnblogs.com/CnZyy/p/3314705.html
Copyright © 2011-2022 走看看