带你深入浅出新面经:十四、十大排序之基数排序

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

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

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

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

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

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

开始部分:

总:基数排序通过多轮次的计数排序(按个位、十位、百位等)来逐位完成排序。

分:

最好时间复杂度就是(n*k)

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

平均时间复杂度也是(n*k)

空间复杂度:n+k

稳定性:稳定。

基数排序算法的实现:

#include <iostream>
#include <vector>
#include <algorithm> // for std::max

// 获取最大值以确定最大位数
int getMax(const std::vector<int>& arr) {
    int max_val = arr[0];
    for (int num : arr) {
        if (num > max_val)
            max_val = num;
    }
    return max_val;
}

// 按位数进行计数排序
void countSort(std::vector<int>& arr, int exp) {//exp是指当前数字位数
    int n = arr.size();
    std::vector<int> output(n); // 输出数组,用于存储排序后的结果
    std::vector<int> count(10, 0); // 计数数组,用于记录每个数出现的次数

    // 计算每个数字在该位上出现的次数
    for (int i = 0; i < n; ++i)
        count[(arr[i] / exp) % 10]++;

    // 计算累积计数
    for (int i = 1; i < 10; ++i)
        count[i] += count[i - 1];

    // 根据累积计数,将元素放到输出数组中
    for (int i = n - 1; i >= 0; --i) {
        output[count[(arr[i] / exp) % 10] - 1] = arr[i];
        count[(arr[i] / exp) % 10]--;
    }

    // 将排序后的结果复制回原数组
    for (int i = 0; i < n; ++i)
        arr[i] = output[i];
}

// 基数排序
void radixSort(std::vector<int>& arr) {
    // 获取数组中的最大值
    int max_val = getMax(arr);

    // 按位数进行排序,从个位开始(exp = 1),依次向更高位进行
    for (int exp = 1; max_val / exp > 0; exp *= 10)
        countSort(arr, exp);
}

// 打印数组
void printArray(const std::vector<int>& arr) {
    for (int num : arr)
        std::cout << num << " ";
    std::cout << std::endl;
}

// 主函数
int main() {
    std::vector<int> arr = {170, 45, 75, 90, 802, 24, 2, 66};
    std::cout << "Given array is \n";
    printArray(arr);

    radixSort(arr);

    std::cout << "\nSorted array is \n";
    printArray(arr);
    return 0;
}

基数排序的步骤可以简化为以下几个关键点:

  1. 找最大值:确定数组中的最大数字,以知道需要排序到多少位。

  2. 循环排序:从最低位(个位)开始,逐步对每一位进行排序。

  3. 计数统计:对每一位上的每个数字出现的次数进行计数。

  4. 计算累积计数:将计数转换为累积计数,为放置元素做准备。

  5. 放置元素:根据累积计数将元素放到临时数组的合适位置。

  6. 复制回原数组:将临时数组中的排序结果复制回原数组。

  7. 重复步骤:重复步骤2-6,直到最高位也排序完成。

  8. 输出结果:打印最终排序后的数组。

总:排序可视化网站(建议打开看着代码来了解)Radix Sort Visualzation

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值