Java數據結構與算法——桶排序

聲明:碼字不易,轉載請註明出處,歡迎文章下方討論交流。

前言:Java數據結構與算法專題會不定時更新,歡迎各位讀者監督。本文從最簡單的一個排序算法——桶排序開始,分析桶排序的實現思路,代碼實現,性能特色以及適用場景。java

0、其餘排序算法索引(待更)

java數據結構與算法——快速排序
java數據結構與算法——插入排序算法

一、桶排序思想

一個簡單例子:
對6我的的英語測試成績(1~10分)進行排序。假如分數是[6,5,8,8,10,9],用桶排序的思想就是準備10個桶,編號依次爲1~10,將成績放入對應的桶中,例如6分放入6號桶,兩個8分放入8號桶...而後按照桶的標號順序逐一輸出(有就輸出,沒有就不輸出),這就是桶排序的基本思想。segmentfault

事實上,這只是一個簡易版,試想一下,若是待排序的元素跨度範圍比較大,例如1~10000,是否是須要10000個桶?實際上這種狀況下,一個桶裏並不是總放一個元素,不少時候一個桶裏放多個元素。其實真正的桶排序和散列表有同樣的原理。數組

實際排序中,一般對每一個桶中的元素繼續使用其餘排序算法進行排序,因此更多時候,桶排序會結合其餘排序算法一塊兒使用。數據結構

二、桶排序代碼

在分析了桶排序的思想後,首先要知道待排序元素的範圍,以上述爲例,聲明一個長度爲10的數組做爲10個桶,而後將成績逐一往桶中放時,該桶的值+1,最終輸出倒序輸出數組下標,數組每一個位置的值爲幾就輸出幾回,這樣就能實現基本的桶排序。性能

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(){
        //倒序輸出數據
        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();//輸出打印排序
    }
}

三、桶排序性能特色

桶排序實際上只須要遍歷一遍全部的待排元素,而後依次放入指定的位置。若是加上輸出排序的時間,就要遍歷全部的桶。所以桶排序的時間複雜度是O(n+m),n是待排元素的個數,m是桶的個數,也就是待排元素的範圍。這個算法算是至關快的排序算法了,可是空間複雜度比較大。this

當待排元素的大小範圍比較大,但待排元素個數比較少時,空間浪費就比較嚴重,待排元素分佈月均勻,空間利用率越高,事實上這種狀況不多見。code

經過以上性能分析,能夠得出桶排序的特色:速度快且簡單,但同時空間利用率較低。當待排數據跨度很大時,空間利用率是沒法忍受的。排序

四、桶排序適用場景

根據桶排序的特色,桶排序通常適用於一些特定的環境,好比數據範圍較爲侷限或者有一些特定的要求,好比須要經過哈希映射快速獲取某些值,須要統計每一個數的數量。可是這一切都以確認數據的範圍爲前提,若是範圍跨度過大,則考慮用其餘算法。

其餘排序算法索引(待更)

java數據結構與算法——快速排序
java數據結構與算法——插入排序

碼字不易,如對您有幫助,歡迎點贊收藏打賞^_^

相關文章
相關標籤/搜索