排序专题之索引排序

时间:2022-04-17 04:42:42

索引排序 和基数排序的 链式法有点相似,

下面来看一下一种索引排序方法


索引数组s[i]存放的是a[i]数组的原先应该在的数组位置,
相当于 a[i]=a[s[i]];
下列演示一个该内容的算法:
从0---n-1开始遍历,如果索引值和当前位置不符合,
就顺着索引链进行循环调整,直到找到等于当前下标值的索引位置为止。
每一轮循环所涉及的记录都调整到位,其索引下标都改为所在位置的小比,
即满足“索引值等于下标值”,因此不会参与其他的循环调整。


void indexsort(record s[],int a[],int n) //先把数字序列转化成索引下标 
{//然后再按照索引数组的值进行排序,
//得到的是排序后的索引的数组值
int i,j;
for(i=0;i<n;i++) s[i]=i;//初始化索引下标
for(i=1;i<n;i++)
for(j=i;j>0;j--)
{
if(s[a[j]]<s[a[j-1]])
swap(s,j,j-1);
else break;
}
suoyin(s,a,n);
}


void adjust(record a[],int suoyin[],int n) //根据索引数组的值回归原数组的值
{
record temp;
int i,j;
for(i=0;i<n;i++) //进行n-1次处理
{
j=i; //循环链中的当前元素
tt=a[i];//存下当前目标数组的值
while(suoyin[j]!=i) //当索引的序列和目标的值未对上的时候
{
int k=suoyin[j]; //把索引值赋给临时k
a[j]=a[k];//把数组k的值给j数组
suoyin[j]=j; //索引j的下标为j
j=k; //把索引值给k 进行下一次的比较
}
a[j]=tt; //最后把原先目标的值给最后一个j
suoyin[j]=j; //索引值改为j
}
}


整个调整过程的代价是O(n),空间代价是O(1)