圖書館排序

圖書館排序 ， 或空位插入排序是一種排序算法 ， 它基於插入排序 ， 但在每兩個元素之間存在空位 ， 以便於加速隨後的插入 。 這個名字來自一個比喻 ： 假設一名圖書管理員在一個長架上按字母順序來整理書 ， 從左邊A開頭的書 ， 一直到右邊Z開頭的書 ， 書本之間沒有空格 。 如果圖書管理員有一本開頭爲B的新書 ， 當他找到了這本書在B區中的正確位置 ， 他將不得不把從該位置後一直到Z的每一本書向右移動 ， 就只是爲了騰出空位放置這本新書 。 這就是插入排序的原理 。 但是 ， 如果他在每一字母區後留有額外的空間 ， 只要在B區之後還有空間 ， 他插入書時就只需要移動少數幾本書 ， 而不會移動後面所有的書 ， 這是圖書館排序的原理 。 此算法由 Michael A. Bender 、 Martín Farach - Colton和Miguel Mosteiro 於2004年提出 ， 並於2006年出版 。 圖書館排序像插入排序一樣 ， 是穩定的排序算法 ， 並且它是在線排序 ； 然而 ， 它被證明在大部分情況下具有O ( n log n ) 的運行速度 （ 相當於快速排序 ） ， 而不是插入排序的O ( n2 ) 。 用於此改進的機制與跳過列表非常相似 。 本文沒有給出完整的實現 ， 也沒有重要部分的確切算法 ， 如插入和重新平衡 。 需要更多的信息來比較圖書館排序的效率與現實中其他排序方法的效率 。 相比基本的插入排序 ， 圖書館排序的缺點是需要額外空間 。 該空間的大小將取決於實作的情況 。 在本文中 ， 需要的空間爲 ( 1 + ε ) n, ， 但沒有進一步的建議如何選擇ε 。 插入排序的一個缺點是它可能需要大量的交換操作 ， 並且如果內存寫入是昂貴的 ， 則成本很高 。 圖書館排序可能會在插入步驟中有所改進 ， 因爲騰出空間所需移動的次數較少 ， 但也因此在重新平衡步驟中增加了額外的成本 。 另外 ， 由於隨機數據集中的每個插入都可以訪問不再處於高速緩存中的內存 ， 特別是對於大型數據集 ， 因此與歸併排序相比 ， 引用的局部性將變差 。