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

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

posted on 2015-12-27 22:09  法杰拉  阅读(349)  评论(0编辑  收藏  举报

导航