排序算法(四)——归并排序
归并排序时间复杂度为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进行拷贝