归并排序,感觉思想其实就是递归思想。
一列数排序,长度为n
我们两两在一起排列,排列好之后再合并
合并过之后再两两排列合并
最后合并成n个数,即最终的有序序列。
结束。
代码很简单,思想也很简单,而且很稳定有木有。最好情况O(n),最坏是O(nlogn),平均是O(nlogn)
代码模板如下:
#include <cstdio>
#include <iostream>
using namespace std;
int a[100005];
int t[100005];
void mergesort(int l,int r)
{
if(l == r)
return ;
int mid = (l + r)/2;
mergesort(l,mid);
mergesort(mid+1,r);
int i = l, j = mid+1, k = l;
while(i <= mid && j <= r)
{
if(a[i] < a[j])
t[k++] = a[i++];
else
t[k++] = a[j++];
}
while(i <= mid)
t[k++] = a[i++];
while(j <= r)
t[k++] = a[j++];
for(int i = l; i <= r; i++)
a[i] = t[i];
}
int main()
{
int n;
cin>>n;
for(int i = 1; i <= n; i++)
cin>>a[i];
mergesort(1,n);
for(int i = 1; i < n; i++)
cout<<a[i]<<" ";
cout<<a[n]<<endl;
return 0;
}