带你深入浅出新面经:十六、十大排序之快速排序

此为面经第十六谈!关注我,每日带你深入浅出一个新面经。

我们要了解面经要如何“说”

很重要!很重要!很重要!

我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的)

码农不易,各位学者学到东西请点赞支持支持

排序算法部分可以记忆简单过程概述。

开始部分:

总:快速排序算法通过选取一个基准值,将数组分为两个子数组,一个包含小于基准值的元素,另一个包含大于基准值的元素,然后递归地对这两个子数组进行同样的操作,直到整个数组变得有序。

分:

最好时间复杂度就是(nlogn)

最差时间复杂度就是(n²)

平均时间复杂度也是(nlogn)

空间复杂度:nlogn

稳定性:不稳定。

#include <iostream>
#include <vector>
#include <algorithm> // 引入algorithm库,用于swap函数

using namespace std;

// 快速排序的分区函数
int partition(vector<int>& arr, int low, int high) {
    int pivot = arr[low]; // 选择基准值,这里选择数组第一个元素
    int i = low; // i作为小于pivot的区域的指示器
    int j = high + 1; // j作为大于pivot的区域的指示器

    // 使用循环进行分区操作
    while (true) {
        // 从左向右找到第一个大于等于pivot的元素,大于才能跳出循环
        while (arr[++i] < pivot);
        // 从右向左找到第一个小于等于pivot的元素,小于才能跳出循环
        while (arr[--j] > pivot && j > low);

        // 如果i和j没有相遇,交换它们所指向的元素
        if (i < j) {
            swap(arr[i], arr[j]);
        } else {
            break; // 如果i和j相遇,跳出循环
        }
    }

    // 将基准值放到正确的位置,即i和j相遇的位置
    swap(arr[low], arr[j]);
    return j; // 返回基准值的索引
}

// 快速排序的递归函数
void quickSort(vector<int>& arr, int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high); // 调用分区函数,并得到基准索引
        quickSort(arr, low, pi - 1); // 递归地对基准左边的子数组排序
        quickSort(arr, pi + 1, high); // 递归地对基准右边的子数组排序
    }
}

// 主函数,用于测试快速排序
int main() {
    vector<int> arr = {10, 7, 8, 9, 1, 5};
    cout << "Original array: ";
    for (int num : arr) cout << num << " ";
    cout << endl;

    quickSort(arr, 0, arr.size() - 1); // 调用快速排序函数

    cout << "Sorted array: ";
    for (int num : arr) cout << num << " ";
    cout << endl;

    return 0;
}

快速排序的过程可以简单概述为以下几个步骤:

  1. 选择基准值(Pivot):通常选择数组的第一个元素或其他某种策略确定的元素作为基准值。

  2. 分区操作:将数组分为两个子区域,左边子区域的所有元素都小于或等于基准值,右边子区域的所有元素都大于或等于基准值。

  3. 递归排序:对基准值左边和右边的子区域递归地应用快速排序,直到每个子区域只有一个元素或为空。

  4. 组合结果:由于子区域是独立排序的,合并它们不会改变元素的顺序,因此不需要额外的合并步骤。

总:排序可视化网站(建议打开看着代码来了解)Comparison Sorting Visualization (usfca.edu)

看着排序过程来理解代码实现会更好。

   学习链接:https://xxetb.xetslk.com/s/3Kif2D

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值