1. 程式人生 > >【模板】快速排序(luogu 1177)

【模板】快速排序(luogu 1177)

i++ 中間 print 傳送門 http pac https tps nbsp

測評傳送門

真正意義上學會快排,以前一直調的sort…… 但畢竟能手寫就手寫,對自己也是一種鍛煉

解析:

快排說白了就是把要排的一行數切成一半,記錄下中間值,在左半部分找到比中間值大的(記d1),再在右半部分找到比中間值小的(記d2)

如果d1在d2的左邊,就交換他們,d1後推一格,d2前推一格,繼續快排

#include<stdio.h>
using namespace std;
int a[100001];

void fast(int l,int r)
{
    int i,j,mid,p;
    i=l,j=r;    
    mid=a[(l+r)>>1];
    
do { while(a[i]<mid) i++; while(a[j]>mid) j--; if(i<=j) { p=a[i]; a[i]=a[j]; a[j]=p; i++,j--; } }while(i<=j); if(l<j) fast(l,j); if(i<r) fast(i,r); } int main() { int n; scanf(
"%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); } fast(1,n); for(int i=1;i<=n;++i){ printf("%d ",a[i]); } return 0; }

【模板】快速排序(luogu 1177)