方法一思路分析:
<1>LSD低关键码优先,适合循环写法
<2>计算每一位重复出现的次数
<3>计算相同数据出现的位置
<4>将数组中的数据放入桶中
<5>重复以上步骤,直到每一位都操作过
代码实现:
void LSDsort(int* array, int size,int n)
{
int* tmp = (int*)malloc(sizeof(int)*size);
int a = 1;
while (n-- != 0)
{
int count[10] = { 0 };
//统计每一位出现相同数字的个数
for (int i = 0; i < size; ++i)
{
//取个位,%10---取十位,/10%10---取百位/100%10
int index = array[i] /a % 10;
count[index]++;
}
int arr[10] = { 0 };
for (int i = 1; i < size; ++i)
{
arr[i] = count[i - 1] + arr[i - 1];
}
memset(tmp, 0, sizeof(int)*size);
for (int i = 0; i < size; ++i)
{
int index = array[i] / a % 10;
tmp[arr[index]++] = array[i];
}
memcpy(array, tmp, sizeof(int)*size);
a *= 10;
}
free(tmp);
tmp = NULL;
}
void PrintAll(int* array, int size)
{
for (int i = 0; i < size; ++i)
{
printf("%d ",array[i]);
}
printf("\n");
}
int main()
{
//int array[] = { 0, 1, 5, 3, 3, 4, 2, 5, 0, 9 };
//CountSort(array, sizeof(array) / sizeof(array[0]));
int array[10] = { 123, 375, 914, 627, 285, 547, 423, 761, 834, 380 };
LSDsort(array, sizeof(array) / sizeof(array[0]),3);
PrintAll(array, sizeof(array) / sizeof(array[0]));
system("pause");
return 0;
}
代码测试运行图:
<1>个位各个数字出现的次数
<2>个位相同数据出现的位置
<3>针对个位排序已完成
图中memcmp是错误的!是手误!正确的应该是memcpy!!!
<4>最终排序结果