图书馆排序

23 篇文章 0 订阅
23 篇文章 0 订阅

图书馆排序(Library Sort)

图书馆排序是基于插入排序改进了的版本,它在元素之间添加了一些空位置,以便在插入排序过程中向后依次移动元素的时候可以减少移动的次数。假使有一个图书馆,书籍都是按照书名的字母序排好的,从左侧的A到右侧的Z,中间没有间隔。假设图书管理员需要新放入一本书名以B开头的书,那他先要找到那个位置,然后把那个位置开始一直往右的书都往后移动,给这本新书腾出位置,这就是普通插入排序。现在,如果他预先在这一系列书之间预留一些空位,那么他在需要插入这本新书的时候,他只需要移动很少的书就可以做到了。

图书馆排序的最坏时间复杂度是O(n2),即要插入的地方都在同一处,留空位的策略根本没用;最好的时间复杂度是线性的,O(n);平均时间复杂度是O(n*logn)。它的缺点在于额外的空间占用,还有一个缺点来自于插入排序,存在大量的交换操作,如果这样的交换导致的写操作开销大的话会成为一个问题(虽然在插入步骤中开销已经好过普通的插入排序,但是在rebalancing步骤中增加了额外的开销)。

算法步骤说明:

假设我们有一个n元数组,然后我们选定了元素间需要预留的空当大小,这样最后这个数组大小是(1 + ε)n。我们需要使用二分查找方式找到元素需要插入的位置,接着往数组里插入元素时,因为元素之间有空当,我们需要移动的元素数量会少过普通插入排序,在插入步骤完成后,我们需要执行重平衡(re-balancing,即给元素之间再补充上需要的空当):

  • 二分查找步骤,线性时间;
  • 插入步骤,插入元素,如果没有插入空当,需要向后移动元素,直到空当出现;
  • 重平衡,给元素之间插入需要的空当,这也应该是线性时间的,因为总共有O(logn)轮,所以总的时间复杂度是O(n*logn)。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值