• 排序算法(四)——归并排序


      归并排序时间复杂度为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进行拷贝

  • 相关阅读:
    个人作业2——英语学习APP案例分析
    结对编程1
    个人作业1——四则运算题目生成程序(基于控制台)
    个人附加作业
    个人作业3——个人总结(Alpha阶段)
    结对编程2--单元测试
    个人作业2——英语学习APP的案例分析
    结对编程1 李雯钰66、钱惠71
    个人作业1——四则运算题目生成程序(基于控制台)
    软件工程的实践项目课程的自我目标
  • 原文地址:https://www.cnblogs.com/hit-joseph/p/5080997.html
Copyright © 2020-2023  润新知