基数排序 低位优先
#include<stdio.h>
#include"lqueue.h"
//获取最大值得位数
int GetFigur(int* arr, int len)
{
if (len < 1)
return -1;
int max = arr[0];
for (int i = 1; i < len; i++)
{
max = max > arr[i] ? max : arr[i];
}
int count = 0;
while (max != 0)
{
max /= 10;
count++;
}
return count;
}
//获取十进制整数右数第figur位的数字,figur从0开始
//例如(123,0)->3 (123,1)->2 (123,2)->1 (123,3)->0
static int GetNum(int n, int figur)
{
for (int i = 0; i < figur; i++)
{
n /= 10;
}
return n % 10;
}
//基数排序
void RadixSort(int* arr, int len)//时间复杂度O(d*n),空间O(n),稳定
{
HNode queArr[10];
for (int i = 0; i < 10; i++)
{
InitQueue(&queArr[i]);
}
//得到最大数字的位数,确定进队和出队的趟数
int count = GetFigur(arr, len);
int index;
for (int i = 0; i < count; i++)//处理每个数字从右往左的第i个数
{
for (int j = 0; j < len; j++)//遍历数组并入队
{
index = GetNum(arr[j], i);
Push(&queArr[index], arr[j]);//将数字放入对应的队列
}
//依次出队
int j = 0;
for (int k = 0; k < 10; k++)
{
while (!IsEmpty(&queArr[k]))
{
Pop(&queArr[k], &arr[j++]);
}
}
}
for (int i = 0; i < 10; i++)
{
Destroy(&queArr[i]);
}
}
int main()
{
int arr[] = { 5,2,3,6,99,8,7,5,3,45,8,6,25236,8,453,425 };
int len = sizeof(arr) / sizeof(arr[0]);
printf("%d ", GetFigur(arr, len));
}