桶排序
前言
桶排序是一个在时间复杂度和空间复杂度十分极端的算法,它的时间复杂度可以达到 ,但是空间复杂度确是十分的高,这个高取决于数组中最大的数。即最大的数是多少,就需要开辟多少的空间,当然这个说法只对于普通的桶排序来说的,对于有些使用链表或者桶排序+插入排序的做法,就各有情况了。
基本做法
做法其实十分的简单,程序中开辟一个笼罩数组数值范围的数组,这个数组中的每个数都被叫做桶,然后遍历需要排序的数组,把数组中的数放入对应的桶中,比如3就放进3号桶,666就放进666号桶,666666就放进666666号桶,最终桶所记录的是桶中数的数量。最后遍历桶,依次取出桶中的数,自然取出的整体就是一个有序的数组。
应用场景
这个算法的应用场景其实十分的多,假设全国有1个亿的高考考生,我们需要对这1个亿的考生的分数进行排序。这里不管是用快排还是基数排序,其实在桶排序面前都不够看。我们只需开辟一个【0,750】的空间,然后直接遍历考生信息,依照分数,把考生信息放入对应的桶里,最后遍历一下(750-0+1)个桶,就能对这1个亿的考生完成分数的排序。
代码
class Solution {
public:
Solution() {}
~Solution() {}
vector<int> sortArray(vector<int>& nums) {
int bucket[MAXSIZE + 1];
memset(bucket, 0, sizeof(bucket));
for (int val : nums) {
bucket[val] ++;
}
int index = 0;
for (int val = 0; val <= MAXSIZE; ++val) {
while (bucket[val]) {
nums[index++] = val;
bucket[val] --;
}
}
return nums;
}
};