408数据结构与算法—基数排序(桶排序)(二十三)

Posted 王同学要努力

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了408数据结构与算法—基数排序(桶排序)(二十三)相关的知识,希望对你有一定的参考价值。

【408数据结构与算法】—基数排序(桶排序)(二十三)

基本思想:分配+收集

基数排序也叫桶排序或箱排序,设置若干箱子,将关键字为k的记录放入第k个箱子,然后按序号将非空的连接。

基数排序:数字是有范围的,均由0-9这是个数字组成,则只需设置十个箱子,相继按个、十、百……进行排序。



C语言代码实现:

//基数排序
void RadixSort(int* arr, int n)

	//max为数组中最大值
	int max = arr[0];
	int base = 1;

	//找出数组中的最大值
	for (int i = 0; i < n; i++)
	
		if (arr[i] > max)
		
			max = arr[i];
		
	
	//循环结束max就是数组最大值


	//临时存放数组元素的空间
	int* tmp = (int*)malloc(sizeof(int)*n);

	//循环次数为最大数的位数
	while (max / base > 0)
	
		//定义十个桶,桶里面装的不是数据本身,而是每一轮排序对应(十、白、千...)位的个数
		//统计每个桶里面装几个数
		int bucket[10] =  0 ;
		for (int i = 0; i < n; i++)
		
			//arr[i] / base % 10可以取到个位、十位、百位对应的数字
			bucket[arr[i] / base % 10]++;
		
		//循环结束就已经统计好了本轮每个桶里面应该装几个数


		//将桶里面的元素依次累加起来,就可以知道元素存放在临时数组中的位置
		for (int i = 1; i < 10; i++)
		
			bucket[i] += bucket[i - 1];
		
		//循环结束现在桶中就存放的是每个元素应该存放到临时数组的位置


		//开始放数到临时数组tmp
		for (int i = n - 1; i >= 0; i--)
		
			tmp[bucket[arr[i] / base % 10] - 1] = arr[i];
			bucket[arr[i] / base % 10]--;
		
		//不能从前往后放,因为这样会导致十位排好了个位又乱了,百位排好了十位又乱了
		/*for (int i = 0; i < n; i++)
		
			tmp[bucket[arr[i] / base % 10] - 1] = arr[i];
			bucket[arr[i] / base % 10]--;
		*/

		//把临时数组里面的数拷贝回去
		for (int i = 0; i < n; i++)
		
			arr[i] = tmp[i];
		
		base *= 10;
	
	free(tmp);


二、基数排序算法分析

  • 时间效率:O(k*(n+m)
  • k:关键字个数
  • m:关键字取值范围为m个值
  • 空间效率:O(n+m)
  • 稳定性:稳定

基数排序算法分析

例如:10000个人按照生日排序

总结

以上是关于408数据结构与算法—基数排序(桶排序)(二十三)的主要内容,如果未能解决你的问题,请参考以下文章

第二十一章 Caché 算法与数据结构 基数排序

408数据结构与算法—归并排序(二十二)

408数据结构与算法—归并排序(二十二)

408数据结构与算法—选择排序(二十)

408数据结构与算法—选择排序(二十)

408数据结构与算法—堆排序(二十一)