算法--快速排序

快速排序模板

快速排序是十分常用的高效率的算法。 其思想是:先选一个“标尺”,

用它把整个队列过一遍筛子,

以保证:其左边的元素都不大于它,其右边的元素都不小于它。 这样,排序问题就被分割为两个子区间。

再分别对子区间排序就可以了。

伪代码
void quick_sort(操作的数组,值的范围l,r)
{
    判断边界,给出递归出口  
    确定一个数x,确定指针i,j
    while(i<j)
    {
        若满足条件,指针向中间移动
        交换两指针所指向的数
    }
    中间数两端递归进行
}

//快速排序模板
#include<iostream>

using namespace std;

const int N=1e6+10;

int n;
int q[N];

void quick_sort(int q[],int l,int r)
{
    if(l>=r) return;
    int x=q[l],i=l-1,j=r+1;
    while(i<j)
    {
        do i++;while(q[i]<x);
        do j--;while(q[j]>x);
        if(i<j) swap(q[i],q[j]);
    }
    quick_sort(q,l,j);
    quick_sort(q,j+1,r);
}

int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&q[i]);

    quick_sort(q,0,n-1);
    
    for(int i=0;i<n;i++) printf("%d",q[i]);

    return 0;
}

1、while循环里面两个do while+一个一个判断 
2、尾递归

复杂度分析
平均时间复杂度:O(NlogN)
最佳时间复杂度:O(NlogN)
最差时间复杂度:O(N^2)

posted @ 2020-12-06 15:38  TheWeak  阅读(45)  评论(0编辑  收藏  举报