十大排序之基数排序(C语言实现)(数据结构)

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。
基数排序是一种非比较排序算法,时间复杂度是 O(n) 。它的主要思路是,

1. 将所有待排序整数(注意,必须是非负整数)统一为位数相同的整数,位数较少的前面补零。一般用10进制,
2. 也可以用16进制甚至2进制。所以前提是能够找到最大值,得到最长的位数,设 k 进制下最长为位数为 d 。
3. 从最低位开始,依次进行一次稳定排序。这样从最低位一直到最高位排序完成以后,整个序列就变成了一个有序序列。
举个例子,有一个整数序列,0, 123, 45, 386, 106,下面是排序过程:
第一次排序,个位,000 123 045 386 106,无任何变化
第二次排序,十位,000 106 123 045 386
第三次排序,百位,000 045 106 123 386
最终结果,0, 45, 106, 123, 386, 排序完成。
为什么同一数位的排序子程序要用稳定排序?因为稳定排序能将上一次排序的成果保留下来。
例如十位数的排序过程能保留个位数的排序成果,百位数的排序过程能保留十位数的排序成果。

通过基数排序对数组{53, 3, 542, 748, 14, 214, 154, 63, 616},它的示意图如下:
十大排序之基数排序(C语言实现)(数据结构)_第1张图片
文章总代码如下:

#include <stdio.h>
#include<stdlib.h>
void radix_sort(int *a,int N);
int GetNum(int num,int s);
int main()
{
	int a[10]={53,3,542,748,14,214,154,63,616,55};
	int i;
	printf("原来的数组顺序为:\n");
	for(i=0;i<10;i++)
		printf("%4d",a[i]);
	radix_sort(a,10);
		printf("排序之后的数组顺序为:\n");
	for(i=0;i<10;i++)
		printf("%4d",a[i]);
	return 0;
}
void radix_sort(int *a,int N)
{
	int i,j;
	int *radixArray[10];//创造一个指针数组,每个数组里面有N+1个指针
	for(i=0;i<N;i++)
	{
		radixArray[i]=(int *)malloc((N+1)*sizeof(int));
		radixArray[i][0]=0;//没有元素个数
	}
	for(int s=1;s<10;s++)//从个位开始
	{
		for(i=0;i<10;i++)//进行分配
		{
			int num=GetNum(a[i],s);//获得相应的位数
			int index=++radixArray[num][0];//对应数组下标
			radixArray[num][index]=a[i];//有多个一样的位数则排在后面
		}
		for(i=0,j=0;i<10;i++)//进行收集,利用循环进行
		{
			for(int k=1;k<=radixArray[i][0];k++)
			{
				a[j++]=radixArray[i][k];
			}
			radixArray[i][0]=0;//复位
		}
	}
}
int GetNum(int num,int s)//获得个位、十位、相应的位数,具体看传进来的s是多少
{
	int temp=1;
	for(int i=0;i<s-1;i++)
	{
		temp*=10;

	}
	return (num/temp)%10;
}

你可能感兴趣的:(排序算法)