1. 程式人生 > >經典排序演算法(二)--桶排序Bucket Sort

經典排序演算法(二)--桶排序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

3 4 5 6 7 8 9]   桶編號(實際不存在)

0表示空桶,跳過,順序取出即可:1 2 4 5 6 9

image

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]);

            }