【八大排序】基数排序(桶排序)

本文详细介绍了基数排序的原理,这是一种稳定且适用于数值差异大的数据排序的算法。通过分配和收集数字到‘桶’中,根据每一位进行排序,时间复杂度为O(dn)。还提供了C语言实现代码,包括获取数字位数和从特定位取值的辅助函数,以及完整的基数排序过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、排序规则

二、代码实现

总结


前言

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

将所有值按照个位,十位,百位...这样子去处理,什么时候停止需要看最大值的位数。

而且被排序序列中的值,位数差异越大,基数排序效率越高。

时间复杂度:O(dn)

空间复杂度:O(dn) d是最大值的位数  

稳定性:稳定


一、排序规则

基数排序(桶排序),就是将所有值的每个位值进行排序,最后使整体有序。

我们一样先设立一组值:{8  7  11  120  3  39  21  9  100  99};

 

 

二、代码实现

代码的实现和其中思想较为简单,但因为需要封装多个基础函数,所以显得代码较长。

//获取数组中最大值的位数
int Get_figure(int arr[], int len)
{
	//assert
	int max = arr[0];
	for (int i = 0; i < len; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
		}
	}

	int count = 0;
	while (max != 0)
	{
		count++;
		max /= 10;
	}

	return count;
}
//获取某个值fig位的值
int Get_num(int n, int fig)
{
	for (int i = 0; i < fig; i++)
	{
		n /= 10;
	}
	return n % 10;
}
void Radix(int arr[], int len, int fig)
{
	int bucket[10][20] = { 0 };//十个桶 可以用队列
	int bucket_num[10] = { 0 };//每个桶内的有效个数(插入位置)

	//从前向后向桶里面放
	for (int i = 0; i < len; i++)
	{
		int index = Get_num(arr[i], fig);
		bucket[index][bucket_num[index]] = arr[i];
		bucket_num[index]++;
	}

	//从前向后向桶里面取
	int k = 0; //代表原先数组arr的下标
	for (int i = 0; i <= 9; i++)
	{
		for (int j = 0; j < bucket_num[i]; j++)
		{
			arr[k++] = bucket[i][j];
		}
	}
}
void RadixSort(int* arr, int len)
{
    assert(arr != NULL);
	//这个函数控制跑几次,   跑几次通过最大值的位数来判定
	int count = Get_figure(arr, len);

	for (int i = 0; i < count; i++)
	{
		Radix(arr, len, i);
	}
}

总结

以上就是今天要学习的内容,本文介绍了基数排序的排序规则和代码实现,其思想较为简单,当数据中各值差异较大时,使用该排序方法较为方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值