归并排序
**基本思想:**归并排序是分治法的一个经典应用,其基本思想为将已经有序的子序列合并,即先使每个自序有序,在使每个子序列段有序。
那么如何得到有序的子序列呢?当序列分解到只有一个元素或是没有元素的时候,就可以认为是有序了,这时分解就结束了。
递归实现
通过其过程发现,归并排序很容易用递归来进行实现,我们需要申请与待排数组长度相等的数组来合并两个有序的子序列,合并完成后再将数据拷贝回原数组。
时间复杂度 O(nlogn) 空间复杂度O(n)
代码实现
#include<iostream>
using namespace std;
void MergeSort(int arr[],int low, int high)//归并排序函数
{
void MergeArray(int arr[],int head1,int tail1,int head2,int tail2); //数组合并函数的声明
if(low<high)
{
MergeSort(arr,low,(low+high)/2);//递归的调用
MergeSort(arr,(low+high)/2+1,high);
MergeArray(arr,low,(low+high)/2,(low+high)/2+1,high);//对两个有序子序列进行合并
}
}
void MergeArray(int arr[],int head1,int tail1,int head2,int tail2)
{
int i=head1,j=head2,k=0;
int* p=new int[tail2-head1+1];//开辟新的数组
int* point=p;
while(i<=tail1&&j<=tail2)
{
if(arr[i]<=arr[j]) p[k++]=arr[i++];
else p[k++]=arr[j++];
}
while(i<=tail1) p[k++]=arr[i++];//如果左边有序子序列未合并完,则将左边剩下的合并
while(j<=tail2) p[k++]=arr[j++];//如果右边有序子序列未合并完,则将右边剩下的合并
for(k=0; k<=tail2-head1; k++) arr[head1+k]=p[k];//将数据拷贝回原来的数组中
delete []point;//释放空间
}
int main()
{
int arr[10000],n;
cin>>n;
for(int i=0; i<n; i++)
cin>>arr[i];
MergeSort(arr,0,n-1);
for(int i=0; i<n; i++)
cout<<arr[i]<<" ";
return 0;
}
引用
该文章图片均引用于博客 点击查看