此为面经第十三谈!关注我,每日带你深入浅出一个新面经。
我们要了解面经要如何“说”!
很重要!很重要!很重要!
我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的)
码农不易,各位学者学到东西请点赞支持支持!
排序算法部分可以记忆简单过程概述。
开始部分:
总:把数据分到多个桶中,各桶内独立排序后再合并回原数组的排序算法。
分:
最好时间复杂度就是(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;
}
桶排序的简单概述过程:
-
初始化桶:创建一个数组,数组中的每个元素都是一个桶(通常是一个列表或向量),用于存放排序过程中的元素。
-
分配元素到桶:遍历输入数组,将每个元素放入对应的桶中。
-
对桶内元素排序:每个桶内的元素可能不是有序的,因此需要对每个桶中的元素进行排序
-
合并桶内元素:通过遍历每个桶,并将桶中的元素按顺序添加回原始数组来完成。
总:排序可视化网站(建议打开看着代码来了解)Bucket Sort Visualization (usfca.edu)
看着排序过程来理解代码实现会更好。
桶排序是一种将输入数据分布到有限数量的桶里,然后对每个桶内的数据进行排序,最后合并桶内数据得到有序序列的排序算法。