演算法、排序(10)

來源:互聯網
上載者:User

     分配排序的基本思想:排序過程無須比較關鍵字,而是通過"分配"和"收集"過程來實現排序.它們的時間複雜度可達到線性階:O(n)。


箱排序(Bin Sort)


1、箱排序的基本思想

     箱排序也稱桶排序(Bucket
Sort),其基本思想是:設定若干個箱子,依次掃描待排序的記錄R[0],R[1],…,R[n-1],把關鍵字等於k的記錄全都裝入到第k個箱子裡
(分配),然後按序號依次將各非空的箱子首尾串連起來(收集)。

【例】要將一副混洗的52張撲克牌按點數A<2<…<J<Q<K排序,需設定13個"箱子",排序時依次將每張牌按點數放入相應的箱子裡,然後依次將這些箱子首尾相接,就得到了按點數遞增序排列的一副牌。



2、箱排序中,箱子的個數取決於關鍵字的取值範圍。


     若R[0..n-1]中關鍵字的取值範圍是0到m-1的整數,則必須設定m個箱子。因此箱排序要求關鍵字的類型是有限類型,否則可能要無限個箱子。


3、箱子的類型應設計成鏈表為宜


     一般情況下每個箱子中存放多少個關鍵字相同的記錄是無法預料的,故箱子的類型應設計成鏈表為宜。



4、為保證排序是穩定的,分配過程中裝箱及收集過程中的串連必須按先進先出原則進行。


(1) 實現方法一

     每個箱子設為一個鏈隊列。當一記錄裝入某箱子時,應做人隊操作將其插入該箱子尾部;而收集過程則是對箱子做出隊操作,依次將出隊的記錄放到輸出序列中。


(2) 實現方法二

     若輸入的待排序記錄是以鏈表形式給出時,出隊操作可簡化為是將整個箱子鏈錶鏈接到輸出鏈表的尾部。這隻需要修改輸出鏈表的尾結點中的指標域,令其指向箱子鏈表的頭,然後修改輸出鏈表的尾指標,令其指向箱子鏈表的尾即可。



5、演算法簡析


     分配過程的時間是O(n);收集過程的時間為O(m) (採用鏈表來儲存輸入的待排序記錄)或O(m+n)。因此,箱排序的時間為O(m+n)。若箱子個數m的數量級為O(n),則箱排序的時間是線性,即O(n)。

 
注意:

     箱排序實用價值不大,僅適用於作為基數排序(下節介紹)的一個中間步驟。

桶排序

     箱排序的變種。為了區別於上述的箱排序,姑且稱它為桶排序(實際上箱排序和桶排序是同義字)。


1、桶排序基本思想

   
 桶排序的思想是把[0,1)劃分為n個大小相同的子區間,每一子區間是一個桶。然後將n個記錄分配到各個桶中。因為關鍵字序列是均勻分布在[0,1)上
的,所以一般不會有很多個記錄落入同一個桶中。由於同一桶中的記錄其關鍵字不盡相同,所以必須採用關鍵字比較的排序方法(通常用插入排序)對各個桶進行排
序,然後依次將各非空桶中的記錄串連(收集)起來即可。
 
注意:
   
 這種排序思想基於以下假設:假設輸入的n個關鍵字序列是隨機分布在區間[0,1)之上。若關鍵字序列的取值範圍不是該區間,只要其取值均非負,我們總能
將所有關鍵字除以某一合適的數,將關鍵字映射到該區間上。但要保證映射後的關鍵字是均勻分布在[0,1)上的。


2、桶排序演算法

  虛擬碼演算法為:

  void BucketSon(R)

    { //對R[0..n-1]做桶排序,其中0≤R[i].key<1(0≤i<n)

      for(i=0,i<n;i++) //分配過程.

        將R[i]插入到桶B[「n(R[i].key)」]中; //可插入表頭上

      for(i=0;i<n;i++) //排序過程

        當B[i]非空時用插人排序將B[i]中的記錄排序;

      for(i=0,i<n;i++) //收集過程

        若B[i]非空,則將B[i]中的記錄依次輸出到R中;

     }

  注意:
   
 實現時需設定一個指標向量B[0..n-1]來表示n個桶。但因為任一記錄R[i]的關鍵字滿足:0≤R[i].key<1(0≤i≤n-1),
所以必須將R[i].key映射到B的下標區間[0,n-1)上才能使R[i]裝入某個桶中,這可通過└n*(R[i].key)┘來實現。


3、桶排序樣本

     R[0..9]中的關鍵字為 (0.78,0.17,0.39,0.26,0.72,0.94,0.21,
0.12,0.23,0.68),用演算法BucketSort排序的過程【參見動畫示範】。

分析:

     這裡n=10,故B[0..9]這10個桶表示的子區間分別是[0,0.1),[0.1,0.2),…,[0.9,1)。

     收集過程只要按B[0],B[1],…,B[9]的次序將各非空桶首尾連結起來,或將其輸出到R[0..9)中即可。



4、桶排序演算法分析


     桶排序的平均時間複雜度是線性,即O(n)。但最壞情況仍有可能是O(n2)。

     箱排序只適用於關鍵字取值範圍較小的情況,否則所需箱子的數目m太多導致浪費儲存空間和計算時間。
  【例】n=10,被排序的記錄關鍵字ki取值範圍是0到99之間的整數(36,5,16,98,95,47, 32,36,48)時,要用100個箱子來做一趟箱排序。(即若m=n2時,箱排序的時間O(m+n)=O(n2))。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.