Java關(guān)于桶排序的知識點總結(jié)
前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時更新,歡迎各位讀者監(jiān)督。本文從最簡單的一個排序算法——桶排序開始,分析桶排序的實現(xiàn)思路,代碼實現(xiàn),性能特點以及適用場景。
0、其他排序算法索引
http://chabaoo.cn/article/120879.htm
1、桶排序思想
一個簡單例子:
對6個人的英語測試成績(1~10分)進(jìn)行排序。假如分?jǐn)?shù)是[6,5,8,8,10,9],用桶排序的思想就是準(zhǔn)備10個桶,編號依次為1~10,將成績放入對應(yīng)的桶中,例如6分放入6號桶,兩個8分放入8號桶...然后按照桶的標(biāo)號順序逐一輸出(有就輸出,沒有就不輸出),這就是桶排序的基本思想。
事實上,這只是一個簡易版,試想一下,如果待排序的元素跨度范圍比較大,例如1~10000,是不是需要10000個桶?實際上這種情況下,一個桶里并非總放一個元素,很多時候一個桶里放多個元素。其實真正的桶排序和散列表有一樣的原理。
實際排序中,通常對每個桶中的元素繼續(xù)使用其他排序算法進(jìn)行排序,所以更多時候,桶排序會結(jié)合其他排序算法一起使用。
2、桶排序代碼
在分析了桶排序的思想后,首先要知道待排序元素的范圍,以上述為例,聲明一個長度為10的數(shù)組作為10個桶,然后將成績逐一往桶中放時,該桶的值+1,最終輸出倒序輸出數(shù)組下標(biāo),數(shù)組每個位置的值為幾就輸出幾次,這樣就能實現(xiàn)基本的桶排序。
public class BucketSort {
private int[] buckets;
private int[] array;
public BucketSort(int range,int[] array){
this.buckets = new int[range];
this.array = array;
}
/*排序*/
public void sort(){
if(array!=null && array.length>1){
for(int i=0;i<array.length;i++){
buckets[array[i]]++;
}
}
}
/*排序輸出*/
public void sortOut(){
//倒序輸出數(shù)據(jù)
for (int i=buckets.length-1; i>=0; i--){
for(int j=0;j<buckets[i];j++){
System.out.print(i+"\t");
}
}
}
}
測試代碼:
public class SortTest {
public static void main(String[] args) {
testBucketsSort();
}
private static void testBucketsSort(){
int[] array = {5,7,3,5,4,8,6,4,1,2};
BucketSort bs = new BucketSort(10, array);
bs.sort();
bs.sortOut();//輸出打印排序
}
}
3、桶排序性能特點
桶排序?qū)嶋H上只需要遍歷一遍所有的待排元素,然后依次放入指定的位置。如果加上輸出排序的時間,就要遍歷所有的桶。因此桶排序的時間復(fù)雜度是O(n+m),n是待排元素的個數(shù),m是桶的個數(shù),也就是待排元素的范圍。這個算法算是相當(dāng)快的排序算法了,但是空間復(fù)雜度比較大。
當(dāng)待排元素的大小范圍比較大,但待排元素個數(shù)比較少時,空間浪費就比較嚴(yán)重,待排元素分布月均勻,空間利用率越高,事實上這種情況很少見。
通過以上性能分析,可以得出桶排序的特點:速度快且簡單,但同時空間利用率較低。當(dāng)待排數(shù)據(jù)跨度很大時,空間利用率是無法忍受的。
4、桶排序適用場景
根據(jù)桶排序的特點,桶排序一般適用于一些特定的環(huán)境,比如數(shù)據(jù)范圍較為局限或者有一些特定的要求,比如需要通過哈希映射快速獲取某些值,需要統(tǒng)計每個數(shù)的數(shù)量。但是這一切都以確認(rèn)數(shù)據(jù)的范圍為前提,如果范圍跨度過大,則考慮用其他算法。
相關(guān)文章
springboot 多環(huán)境配置 yml文件版的實現(xiàn)方法
這篇文章主要介紹了springboot 多環(huán)境配置 yml文件版的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
spring?cloud?eureka?服務(wù)啟動失敗的原因分析及解決方法
這篇文章主要介紹了spring?cloud?eureka?服務(wù)啟動失敗的原因解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
Java使用POI實現(xiàn)導(dǎo)出Excel的方法詳解
在項目開發(fā)中往往需要使用到Excel的導(dǎo)入和導(dǎo)出,導(dǎo)入就是從Excel中導(dǎo)入到DB中,而導(dǎo)出就是從DB中查詢數(shù)據(jù)然后使用POI寫到Excel上。本文將利用POI實現(xiàn)導(dǎo)出Excel,需要的可以參考一下2022-10-10
java執(zhí)行shell并獲取shell輸出日志方式
這篇文章主要介紹了java執(zhí)行shell并獲取shell輸出日志方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
JAVASE精密邏輯控制過程詳解(分支和循環(huán)語句)
在一個程序執(zhí)行的過程中各條語句的執(zhí)行順序?qū)Τ绦虻慕Y(jié)果是有直接影響的,這篇文章主要給大家介紹了關(guān)于JAVASE精密邏輯控制(分支和循環(huán)語句)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04

