八大排序指基数排序

一、基数排序的思想
基数排序也称“桶排序”。
它的基本思想就是:假设一组待排序数据,先对于数据基于个位排序,然后是基于百位排序,基于千位排序,最后使整个序列有序。
二、图解基数排序
给定一组待排序序列
[51 26 7 33 27 534 7648 649 67 49]
1、第一趟排序
按每个数组的个位数字归到相应的桶里,如下图所示:
在这里插入图片描述

第一趟排序过后将每个桶里的数据按顺序摘出来,新的序列为:
[51 33 534 26 7 27 67 7648 649 69]
这样这组数据就按个位数字排列有序了。
2、第二趟排序
按新生成的数组的十位数字归到相应的桶里,如下图所示:
在这里插入图片描述
接着按顺序将数字摘出来,得到新的序列为:
[7 26 27 33 534 7648 649 49 51 67]
3、第三趟排序
按新生成的数组的百位数字归到相应的桶里,如下图所示:
在这里插入图片描述
接着继续将每个数字按顺序摘出来得到新的序列:
[7 26 27 33 49 51 67 534 7648 649]
4、第四趟排序
按新生成的数组的千位数字归到相应的桶里,如下图所示:
在这里插入图片描述
接着继续将每个数字摘出来得到新的序列:
[7 26 27 33 49 51 67 534 649 7648]
这样整个序列就排列有序了。
以上就是基数排序的整个过程。
三、代码实现

//个位代表1   十位代表2   百位代表3
//求最大位数
int GetNumFin(int arr[],int len)
{
	int max = -1;
	int i = 0;
	int count = 0;
	for(i; i < len; i++)
	{
		if(arr[i] > max)
		{
			max = arr[i];
		}
	}
	while(max != 0)
	{
		max = ma / 10;
		count ++;
	}
}
//获取哪一位的数字
int GetFinNumber(int val, iint pos)
{
	return val / (pow(10.0,pos));//求10的几次方
}
void Radix(int arr[],int len,int fin)
{
	int* bucket[10];
	int i = 0;
	int finnum;//代表位数的数字
	int count[10] = {};//代表每个桶当前可插入的元素的下标或者当前桶中的元素
	int arrindex = 0;
	int buckectindex = 0;
	for(i; i < 10; i++)
	{
		buckect[i] = (int*)malloc(sizeof(int)*len - 1);
	}
	for(i = 0; i < len; i++)
	{
		finnum = GetFinNumber(arr[i],fin);
		buckect[finnum][count[finnum]] = arr[i];
		count[finnum]++;
	}
	for(i = 0; i < 10; i++)
	{
		buckect = 0;
		while(count[i] != 0)
		{
			arr[arrindex] = buckect[i][buckectindex];
			buckectindex++;
			arrindex++;
			count[i]--;
		}
	}
	for(i = 0; i < 10; i++)
	{
		free(buckect[i]);
	}
}
void Radixsort(int arr[], int len)
{
	int Maxfin = GetMaxNumFin(arr, len);
	int  i = 0;
	for(i; i < Maxfin; i++)
	{
		Radix(arr, len, i);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值