l + r >> 1的值一定是小于r的,不会取到r。l<r, l+r<2r, (l+r>>1)<(2r>>1), (l+r>>1)<r
而l + r + 1 >> 1的值一定是大于l的,不会取到l。证明类比于上面
>>右移1位,等同于/2
主要注意越界问题
#include<bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int N=1e6+10; int q[N],n; void quickSort(int q[],int l,int r){ if(l>=r) return; int x=q[l+r>>1],i=l-1,j=r+1; while(i<j){ while(q[++i]<x); while(q[--j]>x); if(i<j) swap(q[i],q[j]); } quickSort(q,l,j); quickSort(q,j+1,r); } int main(){ cin>>n; rep(i,0,n-1) cin>>q[i]; quickSort(q,0,n-1); rep(i,0,n-1) cout<<q[i]<<' '; return 0; }