快速排序是基于分治的思想,每次都选择一个基准数,使得左边的都小于基准数,右边都大于基准数(默认基准数为每个排列第一个数),所以基本的思想是用两个指针,分别从最左边和最右边开始寻找,两个如果都找到了话就交换两个数字,需要注意的是,先从左边扫?还是先从右边扫,考虑21(基准数为2)这种情况,如果先从左边扫,寻找大于基准数的数字,找不到.算法结束,如果先从右边扫,寻找小于基准数的数字,找到了为1,交换变为12,综上,必须先从右边扫,再从左边扫(从小到大排列).
思考一下,如果是从大到小排列呢(左边比基准数大,右边比基准数小)?考虑12(基准数为1),如果先从左边扫,寻找小于基准数的数字,找到了1,交换得到序列21.算法结束,如果先从右边扫,寻找大于基准数的数字,找不到,综上,必须先从左边扫,再从右边扫(从大到小排列).
#include "iostream"
using namespace std;
const int maxn=1000;
int a[maxn];
int n;
void quicksort(int l,int r){
if (l>r) {
return;
}
int i=l,j=r;
while (i<j) {//最后左边都小于基准数,右边都大于基准数
while (i<j &&a[j]>=a[l]) {//先寻找小于基准数的,i<j必须有
j--;
}
while (i<j &&a[i]<=a[l]) {//寻找大于基准数的,i<j必须有
i++;
}
swap(a[i], a[j]);
}
swap(a[l], a[j]);//i or j
quicksort(l, i-1);//i or j
quicksort(i+1, r);//i or j
}
int main(){
cin>>n;
for (int i=1; i<=n; i++) {
cin>>a[i];
}
quicksort(1, n);
for (int i=1; i<=n; i++) {
cout<<a[i]<<' ';
}
cout<<endl;
}//10 6 1 2 7 9 3 4 5 10 8
//10 6 1 2 7 9 11 4 5 10 9