题目描述
快排模板
为什么i=l-1,j=r+1?
因为后面的写法是先移动后判断,如果是i=l,j=r,则会漏判断左右边界;
为什么用do-while写法?
因为要实现在交换i和j的值后,i和j都各自移动一个位置。
样例
#include <iostream>
using namespace std;
const int N = 1000010;
int a[N];
void quick_sort(int a[],int l,int r){
if(l>=r) return;
int i = l-1, j = r + 1;
int 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;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
quick_sort(a,0,n-1);
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
你好~ i = l - 1 ,j = r+ 1这一步后面 值会变成什么样呀,是地址吗
这边l-1的话代表的是左边界,数组的左边界是0,这边的话减一就是负一了
感谢~困扰好久了
实际上这里采用while写法也是可以的^ _ ^