桶排序
void In_Solve()
{
scanf("%d",&n);
FORa(i,1,n) scanf("%d",&a),b[a]++; //浪费空间比较大,多一个数组的花费
FORa(i,1,N) while(b[i]--) printf("%d ",i);
}
选择排序
void Solve()
{
FORa(i,1,n)
FORa(j,i+1,n)
if(a[i]>a[j])//从第一个开始,依次与后面的开始比较,不符合就换,直到比到第N个
swap(a[i],a[j]);
FORa(i,1,n) printf("%d ",a[i]);
}
冒泡排序
void Solve()
{
FORa(i,2,n)
FORa(j,i,n)
if(a[j-1]>a[j])//从第一个开始,邻接两个开始比较,不符合就换,直到比到第N个
swap(a[j-1],a[j]); FORa(i,1,n) printf("%d ",a[i]); }
插入排序
oid Solve()
{
int fa;
scanf("%d",&n);
FORa(i,1,n)
{
scanf("%d",&fa);
bool f=1;
FORa(j,1,i-1)
{
if(fa<=a[j]) //找到适合的位置
{
FORs(k,i,j) a[k+1]=a[k];//将不符合的往后都挪一个,腾出一个空间,注意:需要从后往前处理,不然数据可能会错误刷新
a[j]=fa,f=0;//插入,记得标记
break;//尽可能降低时间复杂度
}
}
if(f) a[i]=fa;//没有插入队伍中,则直接跟上队尾
}
FORa(i,1,n) printf("%d ",a[i]);
}
快速排序
void sort(int l,int r)
{
int i=l,j=r,mid=a[(l+r)/2];//确定基准数
do{
while(a[i]<mid) i++;//从左往右找到一个大于基准数的的
while(a[j]>mid) j--;//从右往左找到一个小于基准数的
if(i<=j) swap(a[i],a[j]),i++,j--;//如果符合定位(基准数)的要求,则交换两者
}while(i<=j);//符合定位循环
if(l<j) sort(l,j);//处理左区间
if(i<r) sort(i,r);//处理右区间
}
归并排序
void sort(int l,int r)
{
if(l==r) return;//一定要记得写,分治的bottom
int mid=(l+r)/2,i=l,j=mid+1,k=l;
sort(l,mid),sort(mid+1,r);//处理左右两个区间,使其有序
while(i<=mid&&j<=r)
{
if(a[i]<=a[j]) b[k++]=a[i++];
else b[k++]=a[j++],ans+=mid-i+1;
}
while(i<=mid) b[k++]=a[i++];//处理剩余的部分
while(j<=r) b[k++]=a[j++];//将a中l-r这段区域进行排序结果储存在b数组中
FORa(i,l,r) a[i]=b[i];//将b的结果反馈给a
}