当我知道二分还能用来排序时,终于理解了扫一眼算法和真正算法的区别
其实归并排序的思想很简单,可是代码对蒟蒻来说有一定难度emm
那么先讲思路吧。
怎么说呢,就是把要排序的数组不断分直到无法分为止,然后2个2个合并
在合并的过程中就实现了排序,真神奇
对于这个代码,我的内心是十分抗拒的,不过还是附上吧(敲代码不容易啊)
#include<iostream>
using namespace std;
int a[101],r[101];//r是排序用的数组
void msort(int s,int t){//对一个无序区间进行排序
int i=s,j=t;
if(s==t) return;//判断是否结束,这个千万不能漏
int mid=(s+t)/2;//二分
msort(i,mid);
msort(mid+1,j);//对左右两边序列分别排序
//以下是归并代码
i=s,j=mid+1;
int k=s;//k是r数组中的个数
while(i<=mid&&j<=t){
if(a[i]<=a[j]){
r[k]=a[i];
k++,i++;
}
else{
r[k]=a[j];
j++,k++;
}
}
while(i<=mid){
r[k]=a[i];
k++,i++;
}
while(j<=t){
r[k]=a[j];
k++,j++;
}//接入左右子序列剩余的元素
for(int i=s;i<=t;i++)
a[i]=r[i];//重置a数组
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
msort(1,n);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
要用的朋友们注意根据题目的数据范围改一改呐