桶排序思想及其簡單實現(C )

2021-10-09 14:24:28 字數 1327 閱讀 6577

桶排序,就是利用桶進行排序。

什麼是桶呢?這裡不要把它想複雜了,桶並不是乙個新的高大上的資料結構,它只是乙個裝元素的容器。

比如現在有乙個待排序的陣列a:

array =

不難發現,其中的元素值均處在0~20之間,那我們不妨設計四個桶,其中所裝元素值分別為[0,5),[5,10),[10,15),[15,20)之間。

顯然,通過一次遍歷很容易將a中所有元素都放入其對應的桶中,且因為每個桶的區間都無交集,每個元素歸屬唯一的桶:

第乙個桶:1,3

第二個桶:5,7,8

第三個桶:10,12

第四個桶:19

不妨想一下,這樣做有什麼好處呢?

我們發現,因為桶與桶之間是嚴格有序的,我們只需調整每個桶內元素的順序,然後將桶丟棄,按順序組合元素即可完成排序。

比起將整個陣列排序,桶內排序這件事的難度要小很多,這就充分利用了「大事化小」的思想。(計數排序相當於是桶容量為1時的極端情況)

但是桶排序也有一定的缺點,構造桶時,無論是用陣列還是鍊錶,都會帶來不小的空間開銷,相當於是在「用空間換時間」。其次,桶排序適合那些分布比較均勻的資料,每個桶內的資料越平均,桶排序耗費的時間也就越少。

假設有一陣列,其元素值都在0~1之間,用桶排對其進行排序。

構造桶:以0.1為間隔構造十個桶

分桶:一次遍歷將所有元素放到對應的桶中

部分排序:偷懶直接用庫函式 - -,也可以自己實現乙個排序

下面是**:

#include

#include

#include

using

namespace std;

void

buck_sort

(float array,

int size)

intmain()

;buck_sort

(array,

size

(array));

for(

auto i : array)

cout << i <<

" ";

cout << endl;

return0;

}

其實桶排序的關鍵問題就是:

1.如何設定桶的數量平衡時間和空間的開銷。

2.如何實現桶(陣列?鍊錶?)

3.桶內排序使用何種演算法(這一步直接影響總的時間複雜度)

但在這之前首先要弄懂桶排序的思想:大事化小+部分有序。懂了思想再去實現**就很容易了,自己動手實現乙個桶排序吧~

桶排序的簡單實現

桶排序的思想有點像計數排序,又有點像快速排序,還用到一點hash的東西,值得仔細琢磨。具體做法如下,按照某種hash函式,將資料對映到不同的桶中,使用hash是因為我們要保證每個資料的對映過程應該在常數時間內完成。對映完成後,每個桶中的資料相比於其他桶都是有序的 也就是相鄰的桶有嚴格的順序 這個就有...

排序演算法思想及其C語言實現

查詢最小數字並進行交換 以對8個數字進行排序為例 對下面八個數字進行從小到大的排序,我們採用的方案是先從八個數字中找到最小的數字,在這裡就是將1和最左邊的7交換位置,這之後1的位置固定下來。接下來我們在剩下的數字裡尋找最小數,將最小的4和左邊第二個數字對換位置,於是4和13也交換了位置。我們發現什麼...

演算法 桶排序思想 計數排序 基數排序 桶排序

二.基數排序 三.桶排序 桶排序的思想 量大但範圍最小 既能用陣列下標表示 整數 且 有很多是並列的 其他情況不一定比快速排序快。總結 include using namespace std const int m 50 const int scope 60 void main delete arr...