洛谷T1177 【模板】快速排序 快排

边界情况害人不浅

 1 #include<cstdio>
 2 
 3 using namespace std;
 4 
 5 void qsort(int,int);
 6 
 7 int n,t,a[100005];
 8 
 9 int main(){
10     scanf("%d",&n);
11     for(int i=1;i<=n;i++)scanf("%d",a+i);
12     qsort(1,n);
13     for(int i=1;i<=n;i++)printf("%d ",a[i]);
14     
15     return 0;
16 }
17 
18 void qsort(int l,int r){
19     int i=l,j=r,k=a[(l+r)>>1];
20     
21     while(i<=j){  //<=的目的:将i=j的情况继续处理,直至i>j,下面的i<=j同理 
22         while(a[i]<k)i++;  //<的目的:若用<=,则会在数据为大量重复数字时发生数组越界 
23         while(a[j]>k)j--;  //同上 
24         if(i<=j){
25             t=a[i];
26             a[i]=a[j];
27             a[j]=t;
28             i++;
29             j--;
30         }
31     }
32     
33     if(l<j)qsort(l,j);  //递归边界判断置于上层以节省时间 
34     if(i<r)qsort(i,r);
35 }
原文地址:https://www.cnblogs.com/running-coder-wfh/p/11152336.html