基数排序
思想:先把这组数据的个位排有序,再把十位排有序,再排百位、千位…
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
void ShowArr(int arr[],int len)
{
int i = 0;
for( ; i < len; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int GetMaxNumFin(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];
}
}
printf("max:%d\n",max);
while(max != 0)
{
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 * buckect[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));
}
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++)
{
bucketindex = 0;
while(count[i] != 0)
{
arr[arrindex] = buckect[i][bucketindex];
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);
}
}
int main()
{
int arr[] = {15,3,2,43,46,75,12,4,235,45,7};
int len = sizeof(arr) / sizeof(arr[0]);
ShowArr(arr,len);
RadixSort(arr,len);
ShowArr(arr,len);
}
3451

被折叠的 条评论
为什么被折叠?



