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