Java排序演算法(十):桶式排序__演算法導論

來源:互聯網
上載者:User

 Java排序演算法(十):桶式排序

桶式排序不再是一種基於比較的排序方法,它是一種比較巧妙的排序方式,但這種排序方式需要待排序的序列滿足以下兩個特徵:

待排序列所有的值處於一個可枚舉的範圍之類;

待排序列所在的這個可枚舉的範圍不應該太大,否則排序開銷太大。

排序的具體步驟如下:

(1)對於這個可枚舉範圍構建一個buckets數組,用於記錄“落入”每個桶中元素的個數;

(2)將(1)中得到的buckets數組重新進行計算,按如下公式重新計算:

buckets[i] = buckets[i] +buckets[i-1] (其中1<=i<buckets.length); 

桶式排序是一種非常優秀的排序演算法,時間效率極高,它只要通過2輪遍曆:第1輪遍曆待排資料,統計每個待排資料“落入”各桶中的個數,第2輪遍曆buckets用於重新計算buckets中元素的值,2輪遍曆後就可以得到每個待排資料在有序序列中的位置,然後將各個資料項目依次放入指定位置即可。

桶式排序的空間開銷較大,它需要兩個數組,第1個buckets數組用於記錄“落入”各桶中元素的個數,進而儲存各元素在有序序列中的位置,第2個數組用於緩衝待排資料。

桶式排序是穩定的。

如果待排序資料的範圍在0~k之間,那麼它的時間複雜度是O(k+n)的

桶式排序演算法速度很快,因為它的時間複雜度是O(k+n),而基於交換的排序時間上限是nlg n。

但是它的限制多,比如它只能排整形數組。而且當k較大,而數組長度n較小,即k>>n時,輔助數組C[k+1]的空間消耗較大。

當數組為整形,且k和n接近時, 可以用此方法排序。(有的文章也稱這種排序演算法為“計數排序”)

代碼實現: [java]  view plain copy print ? public class BucketSortTest {       public static int count = 0;          public static void main(String[] args) {              int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 };           print(data);           bucketSort(data, 0, 10);           print(data);          }          public static void bucketSort(int[] data, int min, int max) {           // 緩衝數組           int[] tmp = new int[data.length];           // buckets用於記錄待排序元素的資訊           // buckets數組定義了max-min個桶           int[] buckets = new int[max - min];           // 計算每個元素在序列出現的次數           for (int i = 0; i < data.length; i++) {               buckets[data[i] - min]++;           }           // 計算“落入”各桶內的元素在有序序列中的位置           for (int i = 1; i < max - min; i++) {               buckets[i] = buckets[i] + buckets[i - 1];           }           // 將data中的元素完全複製到tmp數組中           System.arraycopy(data, 0, tmp, 0, data.length);           // 根據buckets數組中的資訊將待排序列的各元素放入相應位置           for (int k = data.length - 1; k >= 0; k--) {               data[--buckets[tmp[k] - min]] = tmp[k];           }       }          public static void print(int[] data) {  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.