yxc:这种有边界问题的的尽量背模板
这里先给出代码(我习惯的模板)
问题在代码下方!
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
void quick_sort(int a[],int l,int r){
if(l>=r)return;//当范围小于一个时,不需要排序
int i=l-1,j=r+1,x=a[(l+r)/2];
while(i<j)
{
do i++;while(a[i]<x);
do j--;while(a[j]>x);
if(i<j)swap(a[i],a[j]); //如果没有发生交叉,就交换数字
}
quick_sort(a,l,j);
quick_sort(a,j+1,r);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
quick_sort(a,1,n);
for(int i=1;i<=n;i++){
cout<<a[i]<<' ';
}
}
问题一:为什么i指向的位置为l-1;j指向的位置为r+1
1解:首先,下面用的是do while结构;其次,由于是先移动后判断
问题二:为什么quick_sort(a,l,j); 而不是quick_sort(a,l,i-1);
quick_sort(a,j+1,r); quick_soet(a,i,r);
2解:两种解法都是可以的,我们里面需要理解的点是i前面的数一定小于x,j右边的数一定大于x;
所以会形成这两种解法