用分治实现快速排序

65 阅读1分钟

代码模板

/*
学acwing的算法基础课学来的,喜欢的话多多支持呀。
*/
//排列中比较不能直接用l或r,只能用i或j
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N];//全局变量
void qsort(int l,int r)
{
   if(l>=r) return;//元素排完了,直接跳出来
   int temp=a[l+r>>1],i=l-1,j=r+1;/*temp把中间值作为基准这样,
   其实也可以第一个或者最后一个元素作为基准
   但是防止元素过界最好选择中间的作为基准
   i-1的目的是更好的排序
   j+也是
   怕两个相等的时候排不了
   */
   while(i<j)//元素不为空
   {
       while(a[++i]<temp);//左边找比基准小的
       while(a[--j]>temp);//右边找比基准大的
       if(i<j) swap(a[i],a[j]);//交换二者的值
   }
   qsort(l,j),qsort(j+1,r);//继续排左边和右边的,方法跟上面一样,用递归来做
}
int main()
{     int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    qsort(0,n-1);//快速排序函数
     for(int i=0;i<n;i++) printf("%d",a[i]);
        return 0;
}
/*到达胜利之前无法回头*/