桶排序是計數排序的公升級版。它利用了函式的對映關係,高效與否的關鍵就在於這個對映函式的確定。為了使桶排序更加高效,我們需要做到這兩點:
在額外空間充足的情況下,盡量增大桶的數量
使用的對映函式能夠將輸入的 n 個資料均勻的分配到 k 個桶中
同時,對於桶中元素的排序,選擇何種比較排序演算法對於效能的影響至關重要。
1. 什麼時候最快
當輸入的資料可以均勻的分配到每乙個桶中。
2. 什麼時候最慢
當輸入的資料被分配到了同乙個桶中。
3. 示意圖
元素分布在桶中:
然後,元素在每個桶中排序:
**實現
package com.data.algorithm;
/** * 排序型別: 桶排序
* 最優:所有資料平均在分配在每個桶
* 最差:所有資料集中在乙個桶,此類場景可以使用 計數排序
* 演算法點評:實現簡單,演算法穩定,時間複雜度低o(n),空間複雜度比計數排序高o(max+1),是乙個完美的演算法
* */
public class bucketsortdemo ;
bucketsort(ins);
for (int i : ins) }
public static void bucketsort(int ins)
int max = integer.min_value;
//1.遍歷找到最大值
for (int i = 0; i < ins.length; i++)
//2.因為考慮正整數,所以需要max+1個桶,乙個桶代表乙個數值,並不是範圍,對於大量資料排序這個地方最好使用鏈式結構,這樣有利於記憶體利用率,但是加大複雜度和降低查詢效率
int bucket = new int[max + 1];
//3.放數入桶的操作,相同的數放在同乙個桶中,桶排序最關鍵的步驟,利用被排序數和桶的對映關係,無需比較。桶排序空間複雜度比較高。
for (int i = 0; i < ins.length; i++)
int i = 0;
//4.遍歷桶陣列
for (int j = 0; j < bucket.length; j++)
for (int k = 0; k < bucket[j]; ++k) }}
}
排序演算法 桶排
時間複雜度最少的排序演算法之一桶排,線性階,具體原始碼如下 public class tongpai int max findmax arr int min findmin arr int cha max min 所要排序陣列的最大值和最小值的差 int tong new int cha 1 創造桶...
基礎演算法之四 排序 之桶排序
桶排序是迄今為止最快的一種排序,其時間複雜度僅為 n 也就是線性複雜度。其主要思想在於 建立有序的桶,遍歷待排序元素,在遍歷此元素的同時,將其對映到對應的桶中。這樣,遍歷一遍,所有的元素就在桶中有了對映。而桶是有序的,再從有序的桶中,將資料重新置於陣列中 這樣就完成了排序。1.最簡單的桶排序演算法 ...
演算法入門(一)排序之桶排序
當我們需要對一組資料 無序 進行排序時,假設期末考試完了,老師要按照分數對大家的名次進行排序,這裡假設五個同學分別考了 5分 3分 5分 2分 8分 滿分十分 當然,我們一下子就看出了其中的奧妙,但是我們用程式該怎麼寫呢?我們可以建立乙個大小為11的陣列 因為這裡統計的是0到10之間的數字出現次數 ...