表排序

1、算法概述

当每一个待排序的元素都非常大,一本书,一部电影等,移动元素的代价比较大,我们选择不移动元素而移动指向他们的指针,这里的指针并不一定指c语言里面的指针,也包括下标等。

  • 间接排序
    定义一个指针数组作为“表”(table)

用插入排序做演示。
在这里插入图片描述
如果仅要求按顺序输出,则输出:
A[table[0]],A[table[1]],……,A[table[N-1]]

2、物理排序

如果需要一定要按照实际的物理地址进行排序,下面一种方法,可以在线性时间复杂度下完成。

  • N个数字的排列由若干个独立的环组成
    在这里插入图片描述
    图中用三种颜色标出了三个环。

分别对每个环里面的元素按照物理排序,取出环中一个元素,保存在临时变量中,由于空出了一个位置,就可以将该位置上本来应该放置的元素移动过来,又空出一个位置,继续移动,直到环中元素访问完成,将保存在临时变量中的元素放在最后一个空位。这就完成了一个环的物理排序。
在这里插入图片描述

如何判断一个环的结束:
每访问一个空位i后,就令table[i]=i。当发现table[i]==i时,环就结束了。

复杂度分析

  • 最好情况:初始即有序
  • 最坏情况:
    • 有[N/2]个环,每个环包含2个元素(二者互换,移动三次)
    • 需要3N/2次元素移动

T = O(m*N) ,m 是每个A元素的复制时间。每个元素都比较大,复制每个元素的时间不可忽略。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值