码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2020-03-31 12:49:14      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:main   pre   iostream   end   循环   div   模板   结束   mes   

模板:

//快速排序
#include <iostream>
using namespace std;
const int N = 100010;
int a[N];
void qsort(int l, int r)
{
    if(l >= r) return;
    int i = l - 1, j = r + 1, x = a[(l + r + 1) >> 1];
    while (i < j) {
        do i++;while(a[i] < x);
        do j--;while(a[j] > x);
        if(i < j) swap(a[i], a[j]);
    }
    qsort(l,i - 1);qsort(i,r);
}
int main()
{
    int n;
    cin>>n;
    for (int i = 0; i<n; i++) {
        cin>>a[i];
    }
    qsort(0,n-1);
    for (int i = 0; i<n; i++) {
        cout<<a[i]<<" ";
    }
}
do i++;while(a[i] < x); 
do j--;while(a[j] > x);
这里也可以写成while(a[++i] < x);while(a[--j] > x);
每次选择的数在快排之后都是左边小于等于它,右边大于等于它,所以递归循环的时候要根据所选的x来相应的变化:
1、若qsort(l,i -1);qsort(i,r), 那么所选择的中间变量就不能是x = a[l]或x = a[l + r >> 1],而应该是x = a[l + r + 1 >> 1]或x = a[r];
2、若qsort(l,j);qsort(j + 1,r);那么所选择的中间变量就不能是x = a[r]或 x = a[l + r + 1 >> 1], 而应该是x = a[l + r >> 1]或 x = a[l];
可以用比如3 5 1 4 2来模拟举例,可以选择第一个数a[l]、中间的数a[l + r >> 1]、右边的数a[r]来模拟,可以确定正确的策略都是在每次外层while循环结束后,qsort(l,j)都是小于等于x的数,qsort(j+1,r)都是大于等于x的数。
然后递归排序即可。
然后可以再选在只有两个数的数列:1 2来进行模拟,确定上面qsort和中间比较数x的选择策略。
第k个数:
//快速排序
#include <iostream>
using namespace std;
const int N = 100010;
int a[N];
int qsort(int l, int r, int k)
{
    if(l >= r) return a[l];
    int i = l - 1, j = r + 1, x = a[l];
    while (i < j) {
        do i++;while(a[i] < x);
        do j--;while(a[j] > x);
        if(i < j) swap(a[i], a[j]);
    }
    int t = j - l + 1;
    if(k <= t) return qsort(l,j,k);
    else return qsort(j + 1, r, k-t);
}
int main()
{
    int n,k;
    cin>>n>>k;
    for (int i = 0; i<n; i++)
        cin>>a[i];

    cout<<qsort(0,n-1,k)<<endl;
    
}

 

快速排序

标签:main   pre   iostream   end   循环   div   模板   结束   mes   

原文地址:https://www.cnblogs.com/longxue1991/p/12603917.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!