基数排序


五大排序之基数排序实现过程:

思想:基数排序又叫桶排序。

第一步:有10个‘桶’,分别标0、1、2、3、4、5、6、7、8、9 这10数。

第二步:a.从待排序中第一个数开始,取个位数,找到桶,把完整数放到桶中,直至所有的数放完。

              b.从1号桶开始取数据,注意哪个先放进去的先出来,依次取出所有的数。

第三步:a.对刚取出的一组数,从第一个数开始,取百位数,找到桶,把完整数放到桶中,直至所有数放完。

              b.重复第二步b步骤。

…………

以此类推,直到待排序中最多位的数,最高位数也被取到。

主要代码:

找到待排序中最大的位数

int FindMaxFinger(int arr[], int len)
{
	int max = arr[0];
	for (int i = 1; i < len; ++i)
	{
		if (arr[i] > max)
		{
                     max = arr[i];
		}
	}
	int count = 0;
	do
	{
		max = max / 10;
		count++;
	}while(max != 0);
	return count;
}

获得该数据【个/十/百……(用fin=0/1/2……表示)】位的数

int FindFingerNumber(int num, int fin)
{
	return num / (int)pow(10.0,fin) % 10;
}

向桶中放数据

int tmp[10][N] = {};//‘桶’
int num_fin;
int count[10] = {};//标记‘桶’中放的数的个数
for (int i = 0; i < len; ++i)
{	
	num_fin = FindFingerNumber(arr[i], fin);
	tmp[num_fin][count[num_fin]] = arr[i];
	count[num_fin]++;
}

从桶中取数据

int index = 0;
for (int i = 0; i < 10; ++i)
{
	for (int j = 0; j < count[i]; ++j)
	{
		arr[index++] = tmp[i][j];
	}
}

完整代码实现过程:

#include<stdio.h>
#include<math.h>
#define N 14

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

int FindFingerNumber(int num, int fin)//求(个、十、百……)位上的数
{
	return num / (int)pow(10.0,fin) % 10;
}

void Radix(int arr[], int len, int fin)
{
	int tmp[10][N] = {};
	int num_fin;
	int count[10] = {};

	for (int i = 0; i < len; ++i)//向‘桶’中放
	{	
		num_fin = FindFingerNumber(arr[i], fin);
		tmp[num_fin][count[num_fin]] = arr[i];
		count[num_fin]++;
	}
	int index = 0;
	for (int i = 0; i < 10; ++i)//从‘桶’中取
	{
		for (int j = 0; j < count[i]; ++j)
		{
			arr[index++] = tmp[i][j];
		}
	}
}

void RadixSort(int arr[], int len)//基数排序
{
	int maxFinNum = FindMaxFinger(arr, len);
	for (int i = 0; i < maxFinNum; ++i)
	{
		Radix(arr, len, i);
	}
}

int main()
{
	int arr[N] = { -1,0,45, 5, 4, 12, 4, 156, 456, 465, 4, 12, 16, 6 };
	int len = N;
	RadixSort(arr,len);
	for(int i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值