C语言基数排序

基数排序目录

基数排序

基数排序( 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;
}

关于基数排序介绍就到这里了,有什么问题请指出

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值