[数据结构与算法-03]快速排序

快速排序

思路

  • 以数组中的任一元素为基准,设这个元素的值为av
  • 两个指针(l,r)分别从数组首尾向中间扫描:
    • 保证l <= r(似乎l < r也可?)
    • 从前往后找到比av大的数停下
    • 从后往前找到比av小的数停下
    • 交换这两个数,然后各自走一格(l++,r--)
  • 递归
  • 为避免对本身有序的数组排序时复杂度过大,av最好随机取值

代码实现

void quickSort(int l, int r){
    int av = a[(l + r) / 2];
    int i = l, j = r;
    do{
        while (a[i] < av) i++;
        while (a[j] > av) 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);
}

P1177 【模板】快速排序

题目描述

利用快速排序算法将读入的 NN 个数从小到大排序后输出。

快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++选手请不要试图使用 STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓。)

输入格式

第 11 行为一个正整数 N,第 22 行包含 N 个空格隔开的正整数 a_i,为你需要进行排序的数,数据保证了 A_i 不超过 10^9109。

输出格式

将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。

输入输出样例

输入 #1复制

5
4 2 4 5 1

输出 #1复制

1 2 4 4 5

说明/提示

对于 20%20% 的数据,有 N\leq 10^3N≤103;

对于 100%100% 的数据,有 N\leq 10^5N≤105。

完整解答

#include<iostream>
#define MAX 1000000
using namespace std;
int n, a[MAX+1];
void quickSort(int l, int r){
    int key = a[(l+r)/2];
    int i = l, j = r;
    do {
        while (a[i] < key) i++;
        while (a[j] > key) 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);
}
int main() {
    cin >> n;
    for (int i = 0;i < n;i++) cin >> a[i];
    quickSort(0, n-1);
    for (int i = 0;i < n;i++) cout << a[i] << " ";
}

或者STL(不是)

#include <iostream>
#include <algorithm>
#define MAX 1000000
using namespace std;
int n, a[MAX+1];
int main (){
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    sort(a, a+n);
    for (int i = 0; i < n; i++) cout << a[i] << " ";
}
posted @ 2021-02-26 22:20  ChenHongKai  阅读(89)  评论(0)    收藏  举报
1 2 3
4