基数排序
基数排序( RadixSort )是一种非比较型的整数排序,适合应用于非复杂场景
基本原理
找到数组中最大数的位数,并以计数器按位来进行排序,
演示原理
1.创建一个数组{5,60,102,45,32,13},准备一个长度十的计数器
2.取数组元素的个位, 使与其当前位相等的计数器下标增一
个位对 数组下标
5的个位对应 5, 60的个位对应 0, 102对应 2, 45对应 5,32的个位对应 2, 13的个位对应索引 3.
3. 让 计数器 从 1 位置累加
累加公式为 计数器 [i] = 计数器[i] + 计数器[i-1]; ( i 为 计数器下标)
4.准备一个 桶 (bucket) 容器 准备装入
桶的长度 由 数组 元素个数来决定,
具体 在桶中位置为 bucket [ 计数器 [ 当前数的个位所对应索引的值 - 1] ] 并且倒着放原数组
最后这个数 对应索引的值 减1
循环直至原数组完全装入
按 个位 装完是这样的
5.最后直接装入原数组
这里再按照以上操作循环 十位 百位( 循环次数由数据最长位数决定 )
按 十位 装完
按 百位 装完
代码演示
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <limits.h>//为了使用整数最小值
#include<stdlib.h>
#include<math.h>
int maxbaits(int*arr, int R)//求数位函数
{
int max = INT_MIN;//设置最小值
for (int i = 0; i < R; i++)
{
if (max < arr[i])
max = arr[i];//找出最大值
}
int res = 0;
while (max != 0)//计算最大值位数
{
res++;
max /= 10;
}
return res;
}
int getDigit(int x, int d)//获取当前数 位数 函数
{
return ((x / (int)pow(10, d - 1)) % 10);//计算当前位数值
}
void RadixSort(int* arr, int L, int R, int digit)
{
int radix = 10;//限制 累加
int i, j, d;
int* bucket = (int*)malloc((R - L + 1) * sizeof(int));//申请bucket
if (bucket == NULL)
return;
for (d = 1; d <= digit; d++)//多少位就循环多少次
{
int* count = (int*)calloc(radix , sizeof(int));//长度十的计数器
if (count == NULL)
return;
for (int i = L; i <= R; i++)
{
j = getDigit(arr[i], d);//求当前位数
count[j]++;//对应索引值加1
}
for (i = 1; i < radix; i++)
{
count[i] += count[i - 1];//累加
}
for (i = R; i >= L; i--)//倒着放
{
j = getDigit(arr[i], d);//求当前位数
bucket[count[j] - 1] = arr[i];//bucket存放位置为 当前位数对应计数器索引的值减1
count[j]--;//让对应索引的值减一
}
for (i = L; i <= R; i++)
{
arr[i] = bucket[i];//写入原数组
}
free(count);//释放count空间
count = NULL;
}
free(bucket);//释放bucket空间
bucket = NULL;
}
void sort(int* arr, int L, int R)
{
if (arr == NULL || R < 2)
return;
RadixSort(arr, L, R - 1, maxbaits(arr, R));
}
int main()
{
int arr[10] = { 24,90,47,86,132,447,99,2,4,2 };
int sz = sizeof(arr) / sizeof(arr[0]);
sort(arr, 0, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
关于基数排序介绍就到这里了,有什么问题请指出