[数据结构与算法-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] << " ";
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号