基数排序_最低位优先法

原理:
从最低位到最高依次排序,假设对第i位排序,排序完之后对每个元素i位左边(包括i位)的数来说,都是已经排好序的。所以当最高位排序完后,对每个元素最高位左边的数来说,都是已经排好序的,即对整个序列来说,排序已经完成。
注意:
基数排序对每位排序时使用的排序算法需要是稳定的。
所谓稳定的是指未排序序列中若有相同的元素,排序过后,这些相同元素的次序不能改变。反之就是不稳定的。

说明:
下面给出的实现,只能排序正数。若想支持负数,需要增加key的取值范围,并在与key有关的操作加上(减去)偏移值(如果用十进制的每一位做键的话,偏移一般就是9)。

C\C++实现:

#include <stdlib.h>
void funRadixSort_LSD(int * arrArr, int iArrLen) //只排序正数 从小到大排序
{
	int * arrTemp = (int *)malloc(sizeof(int)*iArrLen);
	int iMax = arrArr[0];
	for (int i = 1; i < iArrLen; i++)//找出最大值
	{
		if (arrArr[i] > iMax)
			iMax = arrArr[i];
	}
	int iDigitsNumber = 0;//求位数
	do
	{
		iMax /= 10;
		iDigitsNumber++;
	} while (iMax != 0);
	
	int iRadix = 1, iKey;
	int arrCount[10];
	for (int i = 0; i < iDigitsNumber; i++)
	{
		for (int j = 0; j < 10; j++)
			arrCount[j] = 0;//初始化记录器
		for (int j = 0; j < iArrLen; j++)
		{
			iKey = arrArr[j] / iRadix % 10; //记录每个键出现的次数
			arrCount[iKey]++;
		}
		for (int j = 1; j < 10; j++)
			arrCount[j] += arrCount[j - 1];//把次数转化为位置 有1偏移
		for (int j = iArrLen-1; j >=0; j--)//按键的顺序存入临时数组
		{
			iKey = arrArr[j] / iRadix % 10; //arrCount中存的是对应键的排序位置+1
			arrTemp[--arrCount[iKey] ] = arrArr[j];//因为有1偏移,所以要减一
		}
		for (int j = 0; j < iArrLen; j++)
			arrArr[j] = arrTemp[j];
		iRadix *= 10;
	}

	free(arrTemp);
}

反思(胡言乱语可直接忽略):
习惯于用已熟练的方法,导致实现起来特别麻烦,学习还是要不断学习新知识
基础还是要学扎实一点。
以前挖的坑,以后迟早要填的。
避免懒惰和急功近利。

posted @ 2022-04-19 18:17  enbug  阅读(448)  评论(0)    收藏  举报