排序专题之索引排序

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)

以上是关于排序专题之索引排序的主要内容,如果未能解决你的问题,请参考以下文章

Mysql原理篇之索引不懂不要瞎用---04

排序专题之交换排序

排序专题之选择排序

排序算法专题之堆排序

排序算法---插入排序

Mysql之B+树索引实战