快速排序

Posted longxue1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。

模板:

//快速排序
#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;
    
}

 

以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章

算法排序之堆排序

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

如何使用sublime代码片段快速输入PHP头部版本声明

代码片段如何使用CSS来快速定义多彩光标

vs2003:快速片段工具