排序算法——桶排序

桶排序


前言

桶排序是一个在时间复杂度和空间复杂度十分极端的算法,它的时间复杂度可以达到 O ( N ) O(N) ,但是空间复杂度确是十分的高,这个高取决于数组中最大的数。即最大的数是多少,就需要开辟多少的空间,当然这个说法只对于普通的桶排序来说的,对于有些使用链表或者桶排序+插入排序的做法,就各有情况了。

基本做法

做法其实十分的简单,程序中开辟一个笼罩数组数值范围的数组,这个数组中的每个数都被叫做桶,然后遍历需要排序的数组,把数组中的数放入对应的桶中,比如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;
	}
};
发布了39 篇原创文章 · 获赞 9 · 访问量 1936

猜你喜欢

转载自blog.csdn.net/qq_36296888/article/details/103756031