快速排序

2021-09-25 常用算法 排序

# 一、算法思想

快速排序的核心思想是 分治,具体流程如下。

  1. 确定分界点 XX:左右边界、中间位置、随机位置;
  2. 调整区间(重点):使得左区间的数都 X\le{X},右区间的数都 X\ge{X}
  3. 递归处理左右区间

# 二、算法模板

C++

void quickSort(int q[], int l, int r)
{
    if (l >= r) return;

    int x = q[l + (r - l) / 2];
    int i = l - 1, j = r + 1;
    while (i < j) {
        while (q[++i] < x);
        while (q[--j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    quickSort(q, l, j);
    quickSort(q, j + 1, r);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Go

func quickSort(q []int, l int, r int) {
    if l >= r {
        return
    }
    x := q[l+(r-l)/2]
    i, j := l-1, r+1
    for i < j {
        for {
            i++
            if q[i] >= x {
                break
            }
        }
        for {
            j--
            if q[j] <= x {
                break
            }
        }
        if i < j {
            q[i], q[j] = q[j], q[i]
        }
    }
    quickSort(q, l, j)
    quickSort(q, j+1, r)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 三、代码实战

# AcWing 0785


题目:快速排序

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

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

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

输入格式

输入共两行,第一行包含整数 nn

第二行包含 nn 个整数(所有整数均在 11091∼{10}^9 范围内),表示整个数列。

输出格式

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

数据范围

1n1000001\le{n}\le{100000}

输入样例:

5

3 1 2 4 5

输出样例:

1 2 3 4 5

解答代码:

    # AcWing 0786


    题目:第 k 个数

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

    输入格式

    第一行包含两个整数 nnkk

    第二行包含 nn 个整数(所有整数均在 11091∼{10}^9 范围内),表示整个数列。

    输出格式

    输出一个整数,表示数列的第 kk 小的数。

    数据范围

    1n1000001\le{n}\le{100000}
    1kn1\le{k}\le{n}

    输入样例:

    5 3

    2 4 1 5 3

    输出样例:

    3

    解答代码:

      Last Updated: 2023-01-28 4:31:25