作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正!
在顺序存储结构上进行排序需要移动大量记录。当记录很大时,时间耗费很多,此时可用静态链表。
最后可根据需要按adr的值来重排记录的物理位置,重排算法如下:
i=1
起,检查每个分量位置上的记录是否在正确位置adr[i]=i
,则位置正确,不需要调整adr[i]=k
≠
\neq
=i
,则说明r[i]
上应该存放r[k]
。可以先暂存r[i]
,然后将r[k]
移至r[i]
。然后继续检查位置k
,若adr[k]
≠
\neq
=k
,则将r[adr[k]]
移至r[k]
。直至找到j=adr[adr[...adr[k]...]]
使adr[j]=i
,将暂存记录移至r[j]
//根据地址数组对实际物理地址进行重排
void Rearrange(SqList_t* list, int adr[])
{
for (int i = 1; i <= list->len; ++i)
{
if (adr[i] != i)
{
int j, k;
list->rec[0] = list->rec[i]; //暂存记录
for (j = i; adr[j] != i; j = k)//找到位置i应该存放的记录
{
k = adr[j]; //位置j处应该存放记录k
list->rec[j] = list->rec[k];
adr[j] = j; //改变地址数组
}
//位置i上的元素实际应该存放在位置j
list->rec[j] = list->rec[0];
adr[j] = j;
}
}
}