基数排序_最低位优先法
原理:
从最低位到最高依次排序,假设对第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);
}
反思(胡言乱语可直接忽略):
习惯于用已熟练的方法,导致实现起来特别麻烦,学习还是要不断学习新知识
基础还是要学扎实一点。
以前挖的坑,以后迟早要填的。
避免懒惰和急功近利。
浙公网安备 33010602011771号