带你深入浅出新面经:十三、十大排序之桶排序

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

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

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

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

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

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

开始部分:

总:把数据分到多个桶中,各桶内独立排序后再合并回原数组的排序算法。

分:

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

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

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

空间复杂度:n+k

稳定性:稳定。

桶排序算法的代码实现:

#include <iostream>
#include <vector>
#include <algorithm>

// 桶排序算法
void bucketSort(std::vector<float>& arr) {
    int n = arr.size();
    
    // 1. 创建n个空桶,每个桶是一个向量(列表)
    std::vector<std::vector<float>> buckets(n);

    // 2. 将输入数组中的元素分配到相应的桶中
    for (int i = 0; i < n; ++i) {
        int bucketIndex = n * arr[i]; // 计算元素应放入的桶索引
        buckets[bucketIndex].push_back(arr[i]);
    }

    // 3. 对每个桶内的元素进行排序
    for (int i = 0; i < n; ++i) {
        std::sort(buckets[i].begin(), buckets[i].end());
    }

    // 4. 将所有桶中的元素按顺序合并到原数组中
    int index = 0;
    for (int i = 0; i < n; ++i) {//遍历外层桶
        for (int j = 0; j < buckets[i].size(); ++j) {//遍历内层桶
            arr[index++] = buckets[i][j];
        }
    }
}

int main() {
    std::vector<float> arr = {0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68};

    std::cout << "Unsorted array: ";
    for (float num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    bucketSort(arr);

    std::cout << "Sorted array: ";
    for (float num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

桶排序的简单概述过程:

  1. 初始化桶:创建一个数组,数组中的每个元素都是一个桶(通常是一个列表或向量),用于存放排序过程中的元素。

  2. 分配元素到桶:遍历输入数组,将每个元素放入对应的桶中。

  3. 对桶内元素排序:每个桶内的元素可能不是有序的,因此需要对每个桶中的元素进行排序

  4. 合并桶内元素:通过遍历每个桶,并将桶中的元素按顺序添加回原始数组来完成。

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

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

桶排序是一种将输入数据分布到有限数量的桶里,然后对每个桶内的数据进行排序,最后合并桶内数据得到有序序列的排序算法。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值