快速排序从零实现+应用(超详细)

快速排序

题目1

给定你一个长度为 n 的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式
输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。

输出格式
输出共一行,包含 n 个整数,表示排好序的数列。

数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5

#include

using namespace std;

const int N = 1e5+10;

int q[N];

void quick_sort(int q[], int l, int r){
    
    if(l==r) return;
    
    int x = q[(l+r)/2];
    int 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(){
    
    int n;
    cin>>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;
}

算法思想:快速排序是基于分治的思想,其基本思路是首先选取一个基准点,根据这个基准点将数组划分出两个部分,分别对左右两边递归的进行排序。在理想的情况下基准点的划分是能将数据进行中间等长切分的(这样只需要切分logn次,因为每次都变为以前的一半,log的底数为2, 2的n次方次。),最坏的情况需要求切分n次。
复杂度分析:快速排序是一种基于分治思想的排序算法,其时间复杂度为 O(nlogn)。这是因为在每一次递归中,快速排序都会选择一个基准元素(pivot element),并将数组分成两部分:小于基准元素的元素和大于基准元素的元素。然后,递归地对这两部分进行排序。在平均情况下,快速排序每次递归都会将数组分成大小大致相等的两部分,因此每次递归的时间复杂度为 O(n)(因为是在进行线性的一个交换,所以复杂度是O(n))。由于递归的深度为 logn(最坏情况下为 n),所以整个排序过程的时间复杂度为 O(nlogn)。然而,最坏情况下,快速排序的时间复杂度为 O(n^2)。这发生在每次递归所选的基准元素都是当前数组中的最小值或最大值时。在这种情况下,快速排序退化为冒泡排序,每次递归只能将数组分成大小为 1 和 n-1 的两部分,导致时间复杂度为 O(n^2)。为了避免最坏情况的发生,可以使用随机化快速排序(Randomized Quicksort),它在选择基准元素时加入随机性,使得平均情况下时间复杂度保持为 O(nlogn)。

题目2 快速排序的一个应用-第k个数

给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。

输入格式
第一行包含两个整数 n 和 k。

第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。

输出格式
输出一个整数,表示数列的第 k 小数。

数据范围
1≤n≤100000,
1≤k≤n
输入样例:
5 3
2 4 1 5 3
输出样例:
3

#include

using namespace std;

const int N = 100010;

int q[N];

void quick_sort(int q[], int l, int r){
    
    if(l==r) return;
    
    int mid= l + r >> 1;
    int x = q[mid];
    int 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(){
    
    int n;
    int k;
    scanf("%d %d", &n,&k);
    for(int i=0;i<n;i++) scanf("%d",&q[i]);

    quick_sort(q,0,n-1);

    printf("%d",q[k-1]);

    return 0;
}

你可能感兴趣的:(算法,算法,数据结构,排序算法)