// radixSort,基数排序
// O(d(r+n)),稳定
#include <cstdio>
int getDigit(int i, int d)
{
int val;
while(d--)
{
val = i % 10;
i /= 10;
}
return val;
}
void radixSort(int arr[], int l, int r, int digit)
{
int radix = 10;
int i = 0, j = 0;
int count[radix];
int bucket[r-l+1];
for(int d = 1; d <= digit; d++)
{
for(i = 0; i < radix; i++)
count[i] = 0;
for(i = l; i <= r; i++)
{
j = getDigit(arr[i], d);
count[j]++;
}
for(i = 1; i < radix; i++)
count[i] = count[i] + count[i-1];
for(i = r; i >= l; i--)
{
j = getDigit(arr[i], d);
bucket[count[j]-1] = arr[i];
count[j]--;
}
i = l, j = 0;
while(i <= r)
arr[i++] = bucket[j++];
}
}
int main()
{
int arr[] = {170,45,75,90,2,24,802,66};
int n = sizeof(arr)/sizeof(int);
radixSort(arr, 0, n-1, 3);
for(int i = 0; i < n; i++)
printf("%d ",arr[i]);
return 0;
}
// 拓展:
// lsd:最低位优先法,即个位开始(通常使用lsd)
// msd:最高位优先法,即最高位开始
基数排序,radixSort
最新推荐文章于 2022-02-18 16:57:51 发布