介绍
终于到最后一个排序了,肝要没了,自己挖的坑总算要填上了 😄
桶排序算法又称为箱排序算法。它是鸽巢原理的一种归纳。
核心思想
划分 n n n 个大小相同的区间,将待排序序列中的元素按照区间不同,存放在对应区间内,再针对每个区间内的元素进行排序,最后将排序后的每个区间合并起来。
每个区间看成一个桶,那我们这种算法就叫做桶排序算法。例如数列
29
,
14
,
25
,
38
,
35
,
19
,
45
29,14,25,38,35,19,45
29,14,25,38,35,19,45,有7个数可以安排在如图所示的桶中。
假设有
n
n
n 个元素待排序,排序过程中需要用到
m
m
m 个桶,将
n
n
n 个元素分到
m
m
m 个桶内,平均每个桶内有
n
n
n/
m
m
m 个元素。桶内排序的时间复杂度取决于桶类元素个数计算法。因此,当
m
=
=
n
m == n
m==n 时,其时间复杂度为
O
(
n
)
O(n)
O(n),但稳定性由桶类排序算法来定,辅助空间为
O
(
n
+
m
)
O(n+m)
O(n+m)。
在程序设计中,我们往往让一个桶内装一个数(注意:如果有重复的,可以标注该桶内有多个数),这种方法非常浪费空间,如果对于空间没有限制要求的,可以考虑桶排序算法。
代码
C++版
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void bucketSort(vector<int>& nums) {
int n = nums.size();
if (n <= 1) {
return;
}
// 找到最大值和最小值
int maxVal = nums[0], minVal = nums[0];
for (int i = 1; i < n; i++) {
maxVal = max(maxVal, nums[i]);
minVal = min(minVal, nums[i]);
}
// 计算桶的数量,并创建桶
int bucketNum = (maxVal - minVal) / n + 1;
vector<vector<int>> buckets(bucketNum);
// 将元素放入对应的桶中
for (int i = 0; i < n; i++) {
int index = (nums[i] - minVal) / n;
buckets[index].push_back(nums[i]);
}
// 对每个桶中的元素进行排序
for (int i = 0; i < bucketNum; i++) {
sort(buckets[i].begin(), buckets[i].end());
}
// 将排序后的元素放回原数组
int index = 0;
for (int i = 0; i < bucketNum; i++) {
for (int j = 0; j < buckets[i].size(); j++) {
nums[index++] = buckets[i][j];
}
}
}
int main() {
vector<int> nums = {9, 5, 1, 10, 3, 8, 6, 7, 2, 4};
cout << "排序前: ";
for (int num : nums) {
cout << num << " ";
}
cout << endl;
bucketSort(nums);
cout << "排序后: ";
for (int num : nums) {
cout << num << " ";
}
cout << endl;
return 0;
}
Python版
def bucketSort(nums):
n = len(nums)
if n <= 1:
return nums
# 找到最大值和最小值
maxVal = max(nums)
minVal = min(nums)
# 计算桶的数量,并创建桶
bucketNum = (maxVal - minVal) // n + 1
buckets = [[] for _ in range(bucketNum)]
# 将元素放入对应的桶中
for num in nums:
index = (num - minVal) // n
buckets[index].append(num)
# 对每个桶中的元素进行排序
for i in range(bucketNum):
buckets[i].sort()
# 将排序后的元素放回原数组
index = 0
for i in range(bucketNum):
for num in buckets[i]:
nums[index] = num
index += 1
return nums
nums = [9, 5, 1, 10, 3, 8, 6, 7, 2, 4]
print("排序前:", nums)
nums = bucketSort(nums)
print("排序后:", nums)
总结
桶排序效率不定,稳定性不定,连空间都不定,感觉应该没几个人会用这个排序吧。。。
如果对你有帮助,那点个赞吧,球球辣awa。