圖書館排序

圖書館排序(Library Sort)

圖書館排序是基於插入排序改進了的版本,它在元素之間添加了一些空位置,以便在插入排序過程中向後依次移動元素的時候可以減少移動的次數。假使有一個圖書館,書籍都是按照書名的字母序排好的,從左側的A到右側的Z,中間沒有間隔。假設圖書管理員需要新放入一本書名以B開頭的書,那他先要找到那個位置,然後把那個位置開始一直往右的書都往後移動,給這本新書騰出位置,這就是普通插入排序。現在,如果他預先在這一系列書之間預留一些空位,那麼他在需要插入這本新書的時候,他只需要移動很少的書就可以做到了。

圖書館排序的最壞時間複雜度是O(n2),即要插入的地方都在同一處,留空位的策略根本沒用;最好的時間複雜度是線性的,O(n);平均時間複雜度是O(n*logn)。它的缺點在於額外的空間佔用,還有一個缺點來自於插入排序,存在大量的交換操作,如果這樣的交換導致的寫操作開銷大的話會成爲一個問題(雖然在插入步驟中開銷已經好過普通的插入排序,但是在rebalancing步驟中增加了額外的開銷)。

算法步驟說明:

假設我們有一個n元數組,然後我們選定了元素間需要預留的空當大小,這樣最後這個數組大小是(1 + ε)n。我們需要使用二分查找方式找到元素需要插入的位置,接着往數組裏插入元素時,因爲元素之間有空當,我們需要移動的元素數量會少過普通插入排序,在插入步驟完成後,我們需要執行重平衡(re-balancing,即給元素之間再補充上需要的空當):

  • 二分查找步驟,線性時間;
  • 插入步驟,插入元素,如果沒有插入空當,需要向後移動元素,直到空當出現;
  • 重平衡,給元素之間插入需要的空當,這也應該是線性時間的,因爲總共有O(logn)輪,所以總的時間複雜度是O(n*logn)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章