快速排序

来源:互联网 发布:数据库查看器 编辑:程序博客网 时间:2024/04/29 11:17

快速排序是基于分治的思想,每次都选择一个基准数,使得左边的都小于基准数,右边都大于基准数(默认基准数为每个排列第一个数),所以基本的思想是用两个指针,分别从最左边和最右边开始寻找,两个如果都找到了话就交换两个数字,需要注意的是,先从左边扫?还是先从右边扫,考虑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




1 0
原创粉丝点击