五大排序之基数排序实现过程:
思想:基数排序又叫桶排序。
第一步:有10个‘桶’,分别标0、1、2、3、4、5、6、7、8、9 这10数。
第二步:a.从待排序中第一个数开始,取个位数,找到桶,把完整数放到桶中,直至所有的数放完。
b.从1号桶开始取数据,注意哪个先放进去的先出来,依次取出所有的数。
第三步:a.对刚取出的一组数,从第一个数开始,取百位数,找到桶,把完整数放到桶中,直至所有数放完。
b.重复第二步b步骤。
…………
以此类推,直到待排序中最多位的数,最高位数也被取到。
主要代码:
找到待排序中最大的位数
int FindMaxFinger(int arr[], int len)
{
int max = arr[0];
for (int i = 1; i < len; ++i)
{
if (arr[i] > max)
{
max = arr[i];
}
}
int count = 0;
do
{
max = max / 10;
count++;
}while(max != 0);
return count;
}
获得该数据【个/十/百……(用fin=0/1/2……表示)】位的数
int FindFingerNumber(int num, int fin)
{
return num / (int)pow(10.0,fin) % 10;
}
向桶中放数据
int tmp[10][N] = {};//‘桶’
int num_fin;
int count[10] = {};//标记‘桶’中放的数的个数
for (int i = 0; i < len; ++i)
{
num_fin = FindFingerNumber(arr[i], fin);
tmp[num_fin][count[num_fin]] = arr[i];
count[num_fin]++;
}
从桶中取数据
int index = 0;
for (int i = 0; i < 10; ++i)
{
for (int j = 0; j < count[i]; ++j)
{
arr[index++] = tmp[i][j];
}
}
完整代码实现过程:
#include<stdio.h>
#include<math.h>
#define N 14
int FindMaxFinger(int arr[], int len)//找最大位数
{
int max = arr[0];
for (int i = 1; i < len; ++i)
{
if (arr[i] > max)
{
max = arr[i];
}
}
int count = 0;
while (max != 0)
{
max = max / 10;
count++;
}
return count;
}
int FindFingerNumber(int num, int fin)//求(个、十、百……)位上的数
{
return num / (int)pow(10.0,fin) % 10;
}
void Radix(int arr[], int len, int fin)
{
int tmp[10][N] = {};
int num_fin;
int count[10] = {};
for (int i = 0; i < len; ++i)//向‘桶’中放
{
num_fin = FindFingerNumber(arr[i], fin);
tmp[num_fin][count[num_fin]] = arr[i];
count[num_fin]++;
}
int index = 0;
for (int i = 0; i < 10; ++i)//从‘桶’中取
{
for (int j = 0; j < count[i]; ++j)
{
arr[index++] = tmp[i][j];
}
}
}
void RadixSort(int arr[], int len)//基数排序
{
int maxFinNum = FindMaxFinger(arr, len);
for (int i = 0; i < maxFinNum; ++i)
{
Radix(arr, len, i);
}
}
int main()
{
int arr[N] = { -1,0,45, 5, 4, 12, 4, 156, 456, 465, 4, 12, 16, 6 };
int len = N;
RadixSort(arr,len);
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}