(坚持每天都写算法)算法基础复习part1基础算法1-1——快排

发布时间 2024-01-06 00:25:57作者: 程序计算机人

之前写过大概100多道的题目,但是之后因为各种原因很久都没有碰过算法题目,记忆丢失,虽然写题的时候有思路,但是一些语言完全就忘记怎么写了,之后应该也会出一些多语言练习,巩固一下语言基础。

本来想着有笔记所以就只是创建博客但是没有写,然后最近找实习什么的压力蛮大的,所以就写一下纯当疏解压力了。

由于是第一篇随笔,不会太考虑格式,但之后会去找模板

#include <iostream>

using namespace std;

const int N = 100010;

int q[N];

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

    int i = l - 1, j = r + 1, x = q[l + 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;
    scanf("%d", &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;
}

思路:快排是按照二分分成两个数组,右边数组的元素必须大于左边数组的元素,如果在右边数组找到了比a[mid]小的数字,那么就要交换一下,使用递归逐一分割数组。

但是这一道题有一个边界问题,看懂了边界问题建议直接背模板,比赛什么的如果用到一时间肯定是想不起来很多细节的。

细节参考链接:AcWing 785. 快速排序算法的证明与边界分析 - AcWing

关于时间复杂度:看这个代码就知道了,最好是O(nlogn),最差是O(n^2)。