常見排序算法:桶排序算法

每一個桶(bucket)代表一個區間範圍,裏面可以承載一個或多個元素。桶排序的第一步,就是創建這些桶,確定每一個桶的區間範圍:

具體建立多少個桶,如何確定桶的區間範圍,有很多不同的方式。我們這裏創建的桶數量等於原始數列的元素數量,除了最後一個桶只包含數列最大值,前面各個桶的區間按照比例確定。

區間跨度 = (最大值-最小值)/ (桶的數量 - 1)

第二步,遍歷原始數列,把元素對號入座放入各個桶中:

第三步,每個桶內部的元素分別排序(顯然,只有第一個桶需要排序):

第四步,遍歷所有的桶,輸出所有元素:

0.5,0.84,2.18,3.25,4.5

到此爲止,排序結束。

 

代碼:

using namespace std;
//根據待排序數組中的最大元素來創建max個桶,即每個桶只裝對應數組中的一個元素
void BucketSort(int list[], int n,int max)
{
	int Buckets = max;//創建50個桶,即數組最大元素不超過50
	int *buckets=(int *)calloc(max,sizeof(int));//初始化每個桶元素爲0
	for (int i = 0; i < n; i++)
	{
		++buckets[list[i]];//桶索引即代表數組中的元素,桶中的元素代表該索引的總個數
	}
	for (int i = 0,j=0; j < Buckets; j++)
	{
		for (int k = buckets[j]; k > 0; k--)
		{
			list[i++] = j;//根據桶索引將元素重新放入數組中即爲有序數組
		}
	}
}

int main()
{
	int list[] = { 12, 5, 4, 6, 7, 6, 1 ,3};

	BucketSort(list, sizeof(list) / sizeof(int),12);

	for (int i = 0; i < sizeof(list) / sizeof(int); i++)
	{
		cout << list[i] << endl;
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章