首页 > 编程语言 > 详细

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

时间:2015-12-27 23:13:25      阅读:300      评论:0      收藏:0      [点我收藏+]

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

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

原文:http://www.cnblogs.com/hit-joseph/p/5080997.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!