此为面经第十四谈!关注我,每日带你深入浅出一个新面经。
我们要了解面经要如何“说”!
很重要!很重要!很重要!
我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的)
码农不易,各位学者学到东西请点赞支持支持!
排序算法部分可以记忆简单过程概述。
开始部分:
总:基数排序通过多轮次的计数排序(按个位、十位、百位等)来逐位完成排序。
分:
最好时间复杂度就是(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;
}
基数排序的步骤可以简化为以下几个关键点:
-
找最大值:确定数组中的最大数字,以知道需要排序到多少位。
-
循环排序:从最低位(个位)开始,逐步对每一位进行排序。
-
计数统计:对每一位上的每个数字出现的次数进行计数。
-
计算累积计数:将计数转换为累积计数,为放置元素做准备。
-
放置元素:根据累积计数将元素放到临时数组的合适位置。
-
复制回原数组:将临时数组中的排序结果复制回原数组。
-
重复步骤:重复步骤2-6,直到最高位也排序完成。
-
输出结果:打印最终排序后的数组。
总:排序可视化网站(建议打开看着代码来了解)Radix Sort Visualzation
看着排序过程来理解代码实现会更好。