排序专题之索引排序

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

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


索引数组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)
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值