欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

排序算法--桶排序(基数排序)

程序员文章站 2022-03-24 15:41:20
...

排序算法–桶排序(基数排序)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//获取最大位数的位数
int GetMaxNumFin(int arr[],int len)
{
	//0--个位 1--十位  2--百位......
	int max=-1;
	int i=0;
	int count=0;
	for(;i<len;i++)
	{
		if(arr[i]>max)
		{
			max=arr[i];
		}
	}
	while(max!=0)
	{
		max=max/10;
		count++;
	}
	return count;
}

int GetFinNumber(int val,int pos)
{
	//给出数字,获取对应位数的数字
	return val/(int)(pow(10.0,pos))%10;
}
void Radix(int arr[],int len,int fin)
{
	//放入数据进入桶
	int *bucket[10];
	int i=0;
	for(;i<10;i++)
	{
		bucket[i]=(int *)malloc(sizeof(int)*len-1);
	}
	int finnum;//代表位数的数字
	int count[10]={0};//每个桶中当前可插入元素的下标,当前桶中的元素
	//0---
	//1---
	for(i=0;i<len;i++)
	{
		finnum=GetFinNumber(arr[i],fin);
		bucket[finnum][count[finnum]]=arr[i];
		count[finnum]++;
	}
	int arrindex=0;
	int bucketindex=0;
	for(i=0;i<10;i++)
	{
		//从桶中拿数据
		bucketindex=0;
		while(count[i]!=0)
		{
			arr[arrindex]=bucket[i][bucketindex];
			bucketindex++;
			arrindex++;
			count[i]--;
		}
	}
	for(i=0;i<10;i++)
	{
		free(bucket[i]);
	}
}
void RadixSort(int arr[],int len)
{
	//基数排序
	int MaxFin=GetMaxNumFin(arr,len);
	int i=0;
	for(;i<MaxFin;i++)
	{
		Radix(arr,len,i);
	}
}
void show(int arr[],int len)
{
	int i=0;
	for(;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}
int main()
{
	int arr[]={15,3,2,43,46,75,12,4,235,45,7};
	int len=sizeof(arr)/sizeof(int);
	show(arr,len);
	RadixSort(arr,len);
	show(arr,len);
	return 0;
}