表排序

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元素的复制时间。每个元素都比较大,复制每个元素的时间不可忽略。

猜你喜欢

转载自blog.csdn.net/happyjacob/article/details/84316648