将待排序数组分并成两部分,分别执行合并排序,再将两部分有序数组合并为一个,时间复杂度为O(n*lgn)
#include <iostream>
using namespace std;
void mergeSort(int * a,int low,int high);
void merge(int * a,int p,int q,int r);
int main()
{
cout<<"输入数组中元素个数";
int n;
cin>>n;
cout<<"输入数组中的"<<n<<"个元素:";
int * a =new int[n];
int i;
for(i=0;i<n;i++)
{
cin>>a[i];
}
mergeSort(a,0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
void mergeSort(int * a,int low,int high)
{
if(low==high)
return;
int mid=(low+high)/2;
mergeSort(a,low,mid);
mergeSort(a,mid+1,high);
merge(a,low,mid,high);
}
void merge(int * a,int p,int q,int r)
{
int leftNum=q-p+1;
int rightNum=r-q;
int * left=new int[leftNum];
int * right=new int[rightNum];
int i=0,j=0;
for(i=0;i<leftNum;i++)
left[i]=a[p+i];
for(i=0;i<rightNum;i++)
right[i]=a[q+1+i];
i=0;
for(int k=0;k<leftNum+rightNum;k++)
{
if(i<leftNum && j<rightNum)
{
if(left[i]<right[j])
{
a[p]=left[i];p++;i++;
}
else
{
a[p]=right[j];p++;j++;
}
continue;
}
if(i<leftNum)
{
a[p]=left[i];i++;p++;continue;
}
a[p]=right[j];p++;j++;
}
}