快速排序模板

题目

对 n 个元素的数组 a,进行从小到大排序

#include<bits/stdc++.h>
using namespace std;

const int N = 1E5 + 5;

int a[N];

void quick_sort(int l, int r) {
    // 递归的终止情况
    if (l >= r) return;
    // 第一步:分成子问题
    int x = a[l + r >> 1], i = l - 1, j = r + 1;
    while (i < j) {
        // 若从大到小,则这判断反过来
        do ++ i; while (a[i] < x);
        do -- j; while (a[j] > x);

        if (i < j) swap(a[i], a[j]);

    }
    // while 循环结束后,q[l..j] <= x,q[j+1..r] >= x
    //第二步:递归处理子问题
    quick_sort(l, j);
    quick_sort(j + 1, r);
}

int main(){
    int n;
    cin >> n;
    for (int i = 0; i < n; ++ i) {
        cin >> a[i];
    }

    quick_sort(0, n - 1);

    for (int i = 0; i < n; ++ i) {
        cout << a[i] << " ";
    }
    cout << endl;

    return 0;
}

题目
给定 n 个无序数
用快排找出从小到大排序后的第 k 个数

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 5;
int a[N];

int quick_sort(int l, int r, int k) {

    // 只有一个数时,即要找的数
    if (l >= r) return a[l];

    int x = a[l + r >> 1], i = l - 1, j = r + 1;

    while (i < j) {
        do ++ i; while (a[i] < x);
        do -- j; while (a[j] > x);
        if (i < j) swap(a[i], a[j]);
    }
    // 左边元素个数 = j - l + 1
    // 如果 左边 元素个数大于 k 从左边找
    // 否则从 右边 找第 k - (左边元素个数) 的数
    if (j - l + 1 >= k) return quick_sort(l, j, k);
    else return quick_sort(j + 1, r, k - (j - l + 1));

}

int main() {
    int n, k;
    cin >> n >> k;
    for (int i = 0; i < n; ++ i) {
        cin >> a[i];
    }
    cout << quick_sort(0, n - 1, k) << endl;

    return 0;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇