桶排序C++實現

//bucket sort
//現在假設我有一堆蛋,包括麻雀蛋、雞蛋、恐龍蛋,現在我要將這幾種蛋排序下序;
//有點常識就知道,這三種類別的蛋大小是不一樣的,而且每一類蛋的大小也是有區別的,現在我對這三種蛋進行排序,我是這樣排的:
//準備三個桶,把同一類別的蛋放到同一個桶中,然後對每一個桶內的蛋進行排序,然後按順序從三個桶中取出相應蛋排序;
//即,從放有麻雀蛋的桶裏取出所有麻雀蛋,因爲已經有序,直接取出即可,然後再將雞蛋取出,最後取出恐龍蛋,排序完成;
//桶排序即先將大小相近的蛋(或“同一類蛋”)放入到同一個桶中,然後對桶內的蛋進行排序,由於每個桶內蛋的數量比較有限,所以排序效率較高


//桶排序是一種時間複雜度爲O(n)的排序方法,但並不意味着它有多優秀,上帝打開一扇門的同時也會關上一扇窗
//桶排序的侷限如下:
//1)桶排序耗用較大的輔助空間,所需要的輔助空間一般與被排序的數列的最大值與最小值有關;
//2)聽到“桶”,很容易聯想到哈希表,因爲哈希表的衝突解決方法之一開鏈法也相當於一個個桶,事實上,這兩種桶的原理是基本相同的;
//3)並非所有數列都適合桶排序,桶排序適合分佈比較均勻的數列,如1,2,3,6,4,像0,999,558,10000這種就不太適合
//4)桶排序是一種穩定的排序算法
//5)桶排序需要維護一個鏈表,但也有一類簡單的桶排序算例如下,所有不同鍵值是放在不同的桶當中的,所以不用維護鏈表,當然,下面這種方法也不再穩定


#include<vector>
#include<iostream>

using namespace std;

void bucketSort(vector<int>& vec)
{
	int length=vec.size();
	vector<int> buckets(length,0);//準備一堆桶,容器的下標即待排序數組的鍵值或鍵值經過轉化後的值
	//此時每個桶中都是沒有放蛋的,所以都是0

	for(int i=0;i<length;++i)
	{
		buckets[vec[i]]++;//把每個蛋放入到對應的桶中
	}
	
	int index=0;
	for(int i=0;i<length;++i)
	{//把蛋取出,空桶則直接跳過
		for(int j=0;j<buckets[i];j++)
		{
			vec[index++]=i;
		}
	}
}
//上例是直接將鍵值作爲桶下標的程序,沒有經過轉化

int main()
{
	int a[10]={0,2,5,6,3,2,5,9,5,2};
	vector<int> vec(a,a+10);

	bucketSort(vec);
	for(int i=0;i<vec.size();++i)
	{
		cout<<vec[i]<<"   ";
	}
	return 0;
}








發佈了143 篇原創文章 · 獲贊 14 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章