桶排序,就是利用桶進行排序。
什麼是桶呢?這裡不要把它想複雜了,桶並不是乙個新的高大上的資料結構,它只是乙個裝元素的容器。
比如現在有乙個待排序的陣列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...