zoukankan      html  css  js  c++  java
  • 排序算法(四)——归并排序

      归并排序时间复杂度为O(nlogn);

      假设有序列list[begin,......,end],以mid=(begin+end)/2作为划分点,将序列划分为list[beging,....,mid]和list[mid+1,.......,end],分别进行排序,我们只需要将这两个已经排好序的序列归并整合到一个序列中。

      示例:

      序列:9    4    8    6    5    2   1   3   7   10

      划分——序列1:9   4   8   6    5----------》(递归求解)4    5    6    8    9

          序列2:2   1   3   7   10---------》(递归求解)1    2    3    7    10

      归并:将上面两个已经递归求解的序列,归并整合到一起。

    示例代码:

    #include <iostream>

    using namespace std;


    void Merge_sort(int list[],int begin, int end)
    {
      if(end==begin)
        return;
      int mid=(begin+end)/2;
      Merge_sort(list,begin,mid);
      Merge_sort(list,mid+1,end);

      int pa=begin,pb=mid+1;
      int index=0;
      int *copy_list=new int[end-begin+1];
      while(pa<mid+1&&pb<end+1)
      {
        if(list[pa]<list[pb])
        {
          copy_list[index]=list[pa];
          pa++;
        }
        else
        {
          copy_list[index]=list[pb];
          pb++;
        }
        index++;
      }
      while(pa<mid+1)
      {
        copy_list[index]=list[pa];
        pa++;
        index++;
      }
      while(pb<end+1)
      {
        copy_list[index]=list[pb];
        pb++;
        index++;
      }
      for(int i=begin,j=0;i<end+1;i++,j++)
      {
        list[i]=copy_list[j];
      }

    }
    int main()
    {
      int testlist[10]={123,124,25,456,23,576,2,54,77,22};
      Merge_sort(testlist,0,9);

      for(int i=0;i<10;i++)
        cout<<testlist[i]<<" ";

      cout<<endl;
      system("pause");
    }

    备注:为了保证list能够递归下去,必须申请内存空间将list进行拷贝

  • 相关阅读:
    汽车行业如何利用大数据
    汽车行业如何利用大数据
    Linux下Gcc 的编译过程
    第一个GraphX程序
    VC++ 模拟&quot;CLICK事件&quot;关闭指定窗体
    基于Canvas的Char.js库使用
    VELT-0.1.6开发:载入根文件系统
    HDU 5411 CRB and puzzle (Dp + 矩阵高速幂)
    JavaScript图片裁剪
    C++ string中的几个小陷阱,你掉进过吗?
  • 原文地址:https://www.cnblogs.com/hit-joseph/p/5080997.html
Copyright © 2011-2022 走看看