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

    归并排序

      归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。值得注意的是归并排序是一种稳定的排序方法。
    将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

    比较

      归并排序是稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5) (括号中是记录的关键字)时输出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时很重要.这也是它比快速排序优势的地方.

    代码

      下面是我自己参考百度百科,然后用C/C++实现的代码:

     1 //归并操作
     2 void merge(int sourceArr[],int targetArr[],int startIndex,int midIndex,int endIndex)
     3 {
     4     //即两个有序的数组合并
     5     int i = startIndex,j = midIndex + 1,k = startIndex;
     6     while(i <= midIndex  && j <= endIndex)    //有一个数组结束终止循环
     7     {
     8         if(sourceArr[i] < sourceArr[j])
     9         {
    10             targetArr[k++] = sourceArr[i++];
    11         }
    12         else
    13         {
    14             targetArr[k++] = sourceArr[j++];
    15         }
    16     }
    17     while(i <= midIndex)
    18         targetArr[k++] = sourceArr[i++];
    19     while(j <= endIndex)
    20         targetArr[k++] = sourceArr[j++];
    21 }
    22 //二路归并排序,采用分治法:用递归
    23 void mergeSort(int sourceArr[],int targetArr[],int startIndex,int endIndex)
    24 {
    25     int midIndex ;
    26     int tempArr[100];
    27     if(startIndex == endIndex)
    28     {
    29         //首尾索引相等了,说明要执行归并排序的区间为1了,也就是要排序的只有一个元素,此时不用排序
    30         targetArr[startIndex] = sourceArr[startIndex];
    31     }
    32     else
    33     {
    34         midIndex = (startIndex + endIndex) / 2;
    35         mergeSort(sourceArr,tempArr,startIndex,midIndex);                //对左边进行归并排序
    36         mergeSort(sourceArr,tempArr,midIndex + 1,endIndex);                //对右边进行排序
    37         merge(tempArr,targetArr,startIndex,midIndex,endIndex);            //对左右进行合并
    38     }
    39     //左右都排序好之后,进行合并
    40 }
    41 
    42 int main()
    43 {
    44     int a[4]={50,10,30,20};
    45     int b[4];
    46     mergeSort(a,b,0,3);
    47     for(int i=0;i<sizeof(a)/sizeof(*a);i++)
    48         cout <<b[i] << ' ';
    49     cout<<endl;
    50     return 0;
    51 }

    //时间和空间复杂度分析以及非递归代码。。。后续提供

  • 相关阅读:
    struts2 批量上传.
    jsoup html解析器 实现对博客园博文标题链接抓取
    赶鸭子上架的cdq分治
    RE:从零开始的莫比乌斯反演
    我永远无法学会的dp
    gym 101915
    2017-2018 ACM-ICPC Latin American Regional Programming Contest GYM101889
    网络流24T
    re:从零开始的数位dp
    Codeforces Round 504
  • 原文地址:https://www.cnblogs.com/zhuwbox/p/3629788.html
Copyright © 2011-2022 走看看