算法hebingpaixu函数的递归过程只是将待排序的集合一分为二,直至待排序集合只剩下1个元素为止。
然后不断的合并2个排好序的数组段。(它可以和快速排序时间复杂度一致)
举个例子,大致是按这样的情况进行的
初始序列[8] [4] [5] [6] [2] [1] [7] [3]
归并到b [4 8] [5 6] [1 2] [3 7]
复制到a [4 8] [5 6] [1 2] [3 7]
归并到b [4 5 6 8] [1 2 3 7]
复制到a [4 5 6 8] [1 2 3 7]
归并到b [1 2 3 4 5 6 7 8]
复制到a [1 2 3 4 5 6 7 8]
#include<iostream>
#include<conio.h>
#include<cstdlib>
using namespace std;
void hexinsuanfa(int a[],int b[],int l,int mid,int r)
{
int La,Lb,i;
La = Lb = l;//La,Lb分别是a,b数组的左边界
i=mid+1;
while((La<=mid)&&(i<=r))
{
if(a[La]<=a[i]) b[Lb++] = a[La++];
else b[Lb++] = a[i++];
}
if(La>mid)
{
for(int j = i;j<=r;j++) b[Lb++] = a[j];
}
else for(int j = La;j<=mid;j++) b[Lb++] = a[j];
}
void hebingpaixu(int a[],int left,int right,int n)
{
int i;
int *b = new int[n];
if(left<right)
{
i = (right + left)/2;
hebingpaixu(a,left,i,n);//把左半边切割
hebingpaixu(a,i+1,right,n);//把左右半边切割
hexinsuanfa(a,b,left,i,right);//把切割后排好序的个个a数组归并到b中
for(int j = left;j<=right;j++)
{
a[j] = b[j]; //把b数组归并到a中
}
}
}
int main()
{
int n,i=0,j=0;
cout<<"输入你要排序的数组大小:"; cin>>n;
int *hr = new int[n];
cout<<"输入你要排序的数组内容:"<<endl;
for(i=0;i<n;i++) cin>>hr[i];
hebingpaixu(hr,0,n-1,n);
for(i=0;i<n;i++) cout<<hr[i]<<' ';
cout<<endl;
getch();
return 0;
}