排序专题之索引排序
Posted 纯纯的心儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序专题之索引排序相关的知识,希望对你有一定的参考价值。
索引排序 和基数排序的 链式法有点相似,
下面来看一下一种索引排序方法
索引数组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)
以上是关于排序专题之索引排序的主要内容,如果未能解决你的问题,请参考以下文章