条件
表排序的待排元素不是基本数据类型而是结构体或数据块
间接排序
间接排序是指在排序时并不能移动数据本身而是移动指向数据的指针(该指针不一定就是指针变量,可以是能定位到元素的任何信息,比如数组下标的序号)
算法思路
对于待排序列’A’,A中每个元素是关键字(对应结构体或数据块的特征信息)
定义一个指针(待排序列的序号)数组作作为’表’(初始时table[i]=i)
- 待排元素A代表的的是结构体或数据块,因为这些结构体或数据块相对来说较为庞大,所以排序时间接的使用表(代表待排序列位置的指针数组)代替待排序列元素进行排序,而原有待排序列不需要发生改变(即排序发生交互时交换的时表中的指针)
- 实际上就是使用表(代表待排序列位置的指针数组)来替待排序列的索引(下标),通过表中的指针来访问对应的A中元素,对表进行排序就相当于对待排序列进行排序(表中元素值代表A中对应索引元素应该所处改位置)
排序时(设使用插入排序),将两个元素进行比较(A[1]与A[0])比较,将A[1]与A[0]对应的表元素进行位置互换(排序)
- 此时A[0]位置上的表元素从0变为1,代表A[0]位置上的元素实际上放A[1]位置上的元素(1该位置应放置A[1]元素)
不断排序后,就可以得到表中指针已经按照关键字排序完成的数组,待排序列通过该表元素进行访问即是排序后的序列
- 如果仅要求按顺序输出,则输出:A[ table[0] ], A[ table[1] ], ……, A[ table[N-1] ]
物理排序
间接排序后,得到的并不是真正待排序列A的排序,而是使用表来替代A的索引用以访问,若想要将待排序列A真正排序可以再使用物理排序
算法思路
N个数字的排列由若干个独立的环组成
- 间接排序后表中的序列是已经排列好的,该序列中的元素是由若干个环组成的,即从待排序列A中指定位置开始,依次访问对应表中的位置,知道再次回到该起点位置
- 然后从下一个不在环中的位置开始再次找到一个环,直到所有的元素都在环中为止
由于排列由若干个独立的环组成,所以可以将每个环的排列单独处理,将环起始位置的元素放置到一个临时位置Temp中,这样该位置就会空余出来,就可以将该位置应放元素(该位置表元素值对应A中元素)放置到改位置上,之后依次将位置替换直到环结束(每访问一个空位i后,就令table[i]=i。当发现table[i]==i时,环就结束了。)将临时空间将该空余位置填满就完成了这个环的排序
- 即用temp记录初值 ,每次换位置时修改table值,用if ( table[i] == i )判断一个环的结束