經典排序演算法(二)--桶排序Bucket Sort
補充說明三點
1,桶排序是穩定的
2,桶排序是常見排序裡最快的一種,比快排還要快…大多數情況下
3,桶排序非常快,但是同時也非常耗空間,基本上是最耗空間的一種排序演算法
我自己的理解哈,可能與網上說的有一些出入,大體都是同樣的原理
無序陣列有個要求,就是成員隸屬於固定(有限的)的區間,如範圍為[0-9](考試分數為1-100等)
例如待排數字[6 2 4 1 5 9]
準備10個空桶,最大數個空桶
[6 2 4 1 5 9] 待排陣列
[0 0 0 0 0 0 0 0 0 0] 空桶
[0 1 2 3 4 5 6 7 8 9] 桶編號(實際不存在)
1,順序從待排陣列中取出數字,首先6被取出,然後把6入6號桶,這個過程類似這樣:空桶[ 待排陣列[ 0 ] ] = 待排陣列[ 0 ]
[6 2 4 1 5 9] 待排陣列
[0 0 0 0 0 0 6 0 0 0] 空桶
[0 1 2 3 4 5 6 7 8 9] 桶編號(實際不存在)
2,順序從待排陣列中取出下一個數字,此時2被取出,將其放入2號桶,是幾就放幾號桶
[6 2 4 1 5 9] 待排陣列
[0 0 2 0 0 0 6 0 0 0] 空桶
[0 1 2 3 4 5 6 7 8 9] 桶編號(實際不存在)
3,4,5,6省略,過程一樣,全部入桶後變成下邊這樣
[6 2 4 1 5 9] 待排陣列
[0 1 2 0 4 5 6 0 0 9] 空桶
[0 1 2
0表示空桶,跳過,順序取出即可:1 2 4 5 6 9
C#程式碼演示
//待排陣列
var unsorted = new int[] { 6, 2, 4, 1, 5, 9 };
//分配空桶
var buget = new int[10];
//直接以每個待排數字為索引,將自己的值賦值給當前桶
for (int i = 0; i < unsorted.Length; i++)
{
buget[unsorted[i]] = unsorted[i];
}
//跳過值為0的空桶,順序輸出即可
for (int i = 0; i < buget.Length; i++)
{
if (buget[i] > 0)
Console.WriteLine(buget[i]);
}