基数排序(桶排序)

基数排序又叫桶排序:

先按照个位数排序,第一次排序好之后;再次按照十位数进行排序,第二次排序好之后;第三次对百位进行排序..................

实现原理图:拿出一些个类似“桶”的东西 将分别按照个位,十位,百位排序好的放到这些“桶”中,然后按照从小到大,从上到下的规则开始取值

排序的次数是该数组中位数最多的元素来决定的 例如下图中排序三次,最高位数是百

相同道理,如果位数最多元素是千的话,那就得排序四次!

 

 

 

如上所示,排序三次之后就完成了该数组的排序!每个桶大家可以想像成一个队列,具有先进先出的特点!

下面进行代码的实现:

首先得求出数组中的最大位数:

static int Get_Figure_Max(int arr[], int len)  //获取最大位数count
{
	int max = arr[0];
	for (int i = 1; i < len; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
		}
	}
	int count = 0;
	while (max != 0)
	{
		count++;
		max /= 10;
	}
	return count;
}

然后根据传进来index值的不同分别求出个位 十位 百位这些位数上面的数值:

static int Get_Num(int n, int index)  //假设传进来(123,2) 传出的值就是1 获取这个数的百位数字
{            //index = 0 获取个位数字的值  index = 1 获取十位数字的值 以此类推
	for (int i = 0; i < index; i++)
	{
		n = n / 10;
	}
	return n % 10;
}

然后就是根据位数个数和各种位数的数值进行排序的函数:

static void Radix(int arr[], int len, int index)  //index是位数
{
	int brr[10][20]; //代表0~9号桶 就是上图中的长方形格子就是一个桶 十个桶就  十个数据  列少位给大点 所以就brr[10][20]
	int crr[10]; //用crr[i]来代表i号桶中有crr[i]个有效值
 
	for (int i = 0; i < len; i++)
 
	{
		int tmp = Get_Num(arr[i],index); //tmp现在存放的就是arr[i]应该放的桶号
		brr[tmp][crr[tmp]++] = arr[i]; //前面说过crr[i]代表i号桶中有crr[i]个有效值 
		                               // 那么crr[tmp]中就有着tmp号桶中有crr[tmp]个有效值
										//初始有效值都是0 有一个有效值就得++
	}
 
	int k = 0;
	for (int i = 0; i < len; i++)  //二维数组 双层for循环
	{
		for (int j = 0; j < crr[i]; i++)
		{
			arr[k++] = brr[i][j];
		}
	}
}

最后来个函数总成 调用上述函数:

void Radix_Sort(int arr[], int len)
{
	int count = Get_Figure_Max(arr, len);
 
	for (int i = 0; i < count; i++)
	{
		Radix(arr,len,i); //i = 0 以个位排序  i = 1 以十位排序 以此类推
	}
}

上述被调用的函数前面都有static ,这是因为函数调用函数一般不想被他人所见  static隐藏的作用

最后将函数写在一起:

static int Get_Figure_Max(int arr[], int len)  //获取最大位数count
{
	int max = arr[0];
	for (int i = 1; i < len; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
		}
	}
	int count = 0;
	while (max != 0)
	{
		count++;
		max /= 10;
	}
	return count;
}
 
static int Get_Num(int n, int index)  //假设传进来(123,2) 传出的值就是1 获取这个数的百位数字
{                              //index = 0 获取个位数字的值  index = 1 获取十位数字的值 以此类推
	for (int i = 0; i < index; i++)
	{
		n = n / 10;
	}
	return n % 10;
}
 
 
static void Radix(int arr[], int len, int index)  //index是位数
{
	int brr[10][20]; //代表0~9号桶 就是上图中的长方形格子就是一个桶 十个桶就  十个数据  列少位给大点 所以就brr[10][20]
	int crr[10]; //用crr[i]来代表i号桶中有crr[i]个有效值
 
	for (int i = 0; i < len; i++)
 
	{
		int tmp = Get_Num(arr[i],index); //tmp现在存放的就是arr[i]应该放的桶号
		brr[tmp][crr[tmp]++] = arr[i]; //前面说过crr[i]代表i号桶中有crr[i]个有效值 
		                               // 那么crr[tmp]中就有着tmp号桶中有crr[tmp]个有效值
										//初始有效值都是0 有一个有效值就得++
	}
 
	int k = 0;
	for (int i = 0; i < len; i++)  //二维数组 双层for循环
	{
		for (int j = 0; j < crr[i]; i++)
		{
			arr[k++] = brr[i][j];
		}
	}
}
 
void Radix_Sort(int arr[], int len)
{
	int count = Get_Figure_Max(arr, len);
 
	for (int i = 0; i < count; i++)
	{
		Radix(arr,len,i); //i = 0 以个位排序  i = 1 以十位排序 以此类推
	}
}

这玩意思路不难理解,图解也挺简单,代码写起来还不是很简单,主要就是二维数组brr[10][20]中桶中元素的下标crr[]那块难以理解,因为刚开始crr都是零,所以每次使用完之后都得++一下!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值