快速排序(Quicksort)

1.定义

快速排序是对冒泡排序的一种改进算法。

2.基本思路

快速排序的思路大概就是在冒泡排序的基础之上增添了二分的思想。

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

简而言之:将一个序列分成两份,一份中的所有数比另外一份中的任何一个数大,重复操作直到序列有序。

3.应用思路

假设有一个等待排序的序列 $ {a[l],a[l+1],a[l+2].....a[r]} $

1.选定分界值

首先设定一个分界值,将这个序列分为两个部分

2.排序

将大于或等于分界值的数放在数组右边,小于分界值的数放在到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

3."套娃"

此时开始"套娃",对左边和右边分解完的序列再次进行重复操作,递归(套娃)下去直到序列有序即可。

3.代码实现

当然不是这个啦(雾,stl大法好

#include<bits/stdc++.h>
using namespace std;
int n,a[110];
void quicksort(int l,int r){
    sort(a+l,a+l+r);
    return;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
    }
    quicksort(1,n);
    for(int i=1;i<=n;++i){
        printf("%d ",a[i]);
    }printf("\n");
    return 0;
} 

下面这个代码要想过 $ luogu $要改一改,自己看吧

#include<bits/stdc++.h>
using namespace std;
int n,a[100010];
void quicksort(int l,int r){
    int i,j;
    i=l,j=r;
    int mid=a[l+r>>1];
    do{
        while(a[i]<mid) i++;
        while(a[j]>mid) j--;
        if(i<=j){
            swap(a[i],a[j]);
            i++;j--;
        }
    }while(i<=j);
    if(l<j) quicksort(l,j);
    if(i<r) quicksort(i,r);
    return;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
    }
    quicksort(1,n);
    for(int i=1;i<=n;++i){
        if(i<n) printf("%d ",a[i]);
    }printf("\n");
    return 0;
} 

4.讲在最后

快速排序的时间复杂度为 $ O(nlog_n) $ ,这是一个不稳定的算法,同样的时间复杂度的情况下,归并排序则是稳定的,归并排序可以说是排序算法中最优的一种了。

事实上,作为一名c++选手,平时一般都不会这样写, $ sort $ 多香啊,并且 $ sort $ 由于其内部具体原因,其稳定性可以得到保证,甚至可超越 $ O(nlog_n) $

如果想了解更多关于 $ sort $ 的芝士可以看一下这篇洛谷日报

浅析sort