排序专题之索引排序

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

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


索引数组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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值