桶排序
动态图链接:Bilibili桶排序动态图
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;void bucketSort(vector<int>& arr, int maxVal) {int n = arr.size();vector<vector<int>> buckets(maxVal + 1);// 将元素分配到桶中for (int i = 0; i < n; ++i) {int bucketIndex = arr[i];buckets[bucketIndex].push_back(arr[i]);}// 对每个桶中的元素进行排序for (int i = 0; i <= maxVal; ++i) {sort(buckets[i].begin(), buckets[i].end());}// 合并所有桶的元素int index = 0;for (int i = 0; i <= maxVal; ++i) {for (int j = 0; j < buckets[i].size(); ++j) {arr[index++] = buckets[i][j];}}
}
int main() {vector<int> arr = { 300, 26,38, 2, 111,111, 112, 7 };//max_element()是一个标准库函数,搜寻向量arr,返回了一个最大值迭代器,用*解引用出迭代器的数值int maxVal = *max_element(arr.begin(), arr.end());cout << "原始数组:" <<endl;for (int num : arr) {cout << num << " ";}cout << endl;bucketSort(arr, maxVal);cout << "排序后的数组:" << endl;for (int num : arr) {cout << num << " ";}cout << endl;return 0;
}
桶排序的时间复杂度和空间复杂度取决于桶的数量和桶内使用的排序算法。
-
时间复杂度
:- 如果在桶内使用的是稳定的排序算法,并且桶的数量合理选择,那么桶排序的时间复杂度可以近似为
O(n + k)
,其中n
是待排序元素的数量,k
是桶的数量。 - 在最坏情况下,所有元素都落在同一个桶中,桶内的排序算法时间复杂度为
O(nlogn)
。因此,如果桶的数量和元素数量相等,则桶排序的时间复杂度会退化为O(nlogn)
。 - 总体来说,桶排序的平均时间复杂度为
O(n + n/k * O(klogk))
,其中 k 是桶的数量。
- 如果在桶内使用的是稳定的排序算法,并且桶的数量合理选择,那么桶排序的时间复杂度可以近似为
-
空间复杂度
:- 桶排序的空间复杂度取决于桶的数量和每个桶的大小。通常情况下,桶的数量和待排序元素的数量相等,因此桶排序的空间复杂度主要由桶的大小决定。
- 如果每个桶的大小是固定的,那么桶排序的空间复杂度为
O(n + k)
,其中n
是待排序元素的数量,k
是桶的数量。 - 如果每个桶的大小是不固定的,那么桶排序的空间复杂度可能会更高,取决于桶内元素的数量分布情况。
总的来说,桶排序的时间复杂度和空间复杂度取决于桶的数量、桶的大小以及桶内使用的排序算法。在适当的情况下,桶排序可以提供比较高的性能,并且具有较低的空间开销。