排序算法--基数排序

#define _CRT_SECURE_NO_WARNINGS

#include<math.h>
#include <stdio.h>
#include <stdlib.h>

int findMaxNum(int *p, int n);
void sort2(int *p, int n, int loop);
void bucketSort3(int *p, int n);
int getLoopTimes(int num);
/*
基数排序原理:
求出数组中最大值
求出最大值的位数,作为循环轮次;
第一轮:按照个位排序
第二轮:按照十位排序
……
直到最高位
*/
testBS()
{
	int a[] = { 2, 343, 342, 1, 123, 43, 4343,3, 433, 687, 654, 3 };
	int size = sizeof(a) / sizeof(int);
	//基数排序
	bucketSort3(a, size);
	//打印排序后结果
	int i;
	for (i = 0; i < size; i++)
	{
		printf("%d\n", a[i]);
	}

}
//基数排序
void bucketSort3(int *p, int n)
{
	//获取数组中的最大数
	int maxNum = findMaxNum(p, n);
	//获取最大数的位数,次数也是再分配的次数。
	int loopTimes = getLoopTimes(maxNum);
	int i;
	//对每一位进行桶分配
	for (i = 1; i <= loopTimes; i++)
	{
		sort2(p, n, i);
	}
}
//获取数字的位数
int getLoopTimes(int num)
{
	int count = 1;
	int temp = num / 10;
	while (temp != 0)
	{
		count++;
		temp = temp / 10;
	}
	return count;
}
//查询数组中的最大数
int findMaxNum(int *p, int n)
{
	int i;
	int max = 0;
	for (i = 0; i < n; i++)
	{
		if (*(p + i) > max)
		{
			max = *(p + i);
		}
	}
	return max;
}
//将数字分配到各自的桶中,然后按照桶的顺序输出排序结果
void sort2(int *p, int n, int loop)
{
	//建立一组桶此处的20是预设的根据实际数情况修改
	int buckets[10][12] = {0};
	//求桶的index的除数
	//如798个位桶index=(798/1)%10=8
	//十位桶index=(798/10)%10=9
	//百位桶index=(798/100)%10=7
	//tempNum为上式中的1、10、100
	int tempNum = (int)pow(10, loop - 1);
	int i, j;
	for (i = 0; i < n; i++)
	{
		int row_index = (*(p + i) / tempNum) % 10;
		for (j = 0; j < 12; j++)
		{
			if (buckets[row_index][j] == 0)
			{
				buckets[row_index][j] = *(p + i);
				break;
			}
		}
	}
	//将桶中的数,倒回到原有数组中
	int k = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 12; j++)
		{
			if (buckets[i][j] != 0)
			{
				*(p + k) = buckets[i][j];
				buckets[i][j] = 0;
				k++;
			}
		}
	}
}

int main()
{
	testBS();

	system("pause");
}

整理自:

http://baike.baidu.com/link?url=lRiY45uggf5cxgOJ7CvvetViKimz4OphF1AwwEfYX8lLA1DdkC-lIhTs7jggaV1WkwvTTzLC9kdP5m4U4GzyokfdDDy_H_lmt0XUpPskspbhLSzw_KlkM33-cRdpUFOC

时间: 2024-11-05 18:31:59

排序算法--基数排序的相关文章

经典排序算法 - 基数排序Radix sort

经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是需要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数 例如 待排序数组[62,14,59,88,16]简单点五个数字 分配10个桶,桶编号为0-9,以个位数数字为桶编号依次入桶,变成下边这样 |  0  |  0  | 62 |  0  | 14 |  0  | 16 |  0  |  88 | 59 | |  0  |  1  |  2  |  3  |  4 | 

排序算法----基数排序(RadixSort(L))单链表智能版本

转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.在每一次排序中,按照当前位把数组元素放到对应 的桶当中,然后把桶0到桶9中的元素按先进先出的方式放回数组中.这样从最低位排序一直到最高位排序完成以后,

排序算法----基数排序(RadixSort(L,max))单链表版本

转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.在每一次排序中,按照当前位把数组元素放到对应 的桶当中,然后把桶0到桶9中的元素按先进先出的方式放回数组中.这样从最低位排序一直到最高位排序完成以后,

排序算法——基数排序(桶式排序)

基数排序(radix sort)属于"分配式排序"(distribution sort),又称"桶子法"(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些"桶"中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法.(引自百度百科) 简单的理解就是按权高低依次排序.比如说

经典排序算法---基数排序

假设原来有一串数值如下所示: 73, 22, 93, 43, 55, 14, 28, 65, 39, 81 首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中: 0 1 81 2 22 3 73 93 43 4 14 5 55 65 6 7 8 28 9 39 第二步 接下来将这些桶子中的数值重新串接起来,成为以下的数列: 81, 22, 73, 93, 43, 14, 55, 65, 28, 39 接着再进行一次分配,这次是根据十位数来分配: 0 1 14 2 22 28 3 3

Java排序算法——基数排序

经典排序算法

经典排序算法(via  kkun) 经典排序算法,以下文章参考了大量网上的资料,大部分都给出了出处 这一系列重点在理解,所以例子什么的都是最简单的情况,难免失误之处,多指教 大多数排序算法都给出了每一步的状态,以方便初学者更容易理解,通俗易懂,部分难以理解的排序算法则给出了大量的图示,也算是一个特色吧 经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort 经典排序算法 -  插入排序Insertion sort 经典排序算法 - 基数排序Radix so

各种排序算法汇总(转)

目录 简介 交换排序 冒泡排序 快速排序 插入排序 直接插入排序 希尔排序 选择排序 简单选择排序 堆排序 归并排序 基数排序 总结 简介 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列.分内部排序和外部排序.若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序.反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序.内部排序的过程是一个逐步扩大记录的有序序列长度的过程. 将杂乱无章的数据元素,通过

转载:各种排序算法汇总

转载地址:http://www.cnblogs.com/wolf-sun/p/4312475.html 各种排序算法汇总 目录 简介 交换排序 冒泡排序 快速排序 插入排序 直接插入排序 希尔排序 选择排序 简单选择排序 堆排序 归并排序 基数排序 总结 简介 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记 录序列.分内部排序和外部排序.若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序.反之,若参加排序的记录数量很大,整个序列的排序过 程不可