您的位置:首页 > 其它

基数排序

2017-08-29 23:09 218 查看
一、基数排序

1、基数排序又叫桶排序,借助多关键字排序的思想对单逻辑关键字进行排序。

2、基本思想:

  (1)用0~9作为下标分别记录的个位、十位、百位...0~9的数字,首先对应个位将数据入桶。

  (2)保证先进先出将数据重新排列,然后相同的方法看十位数字将数据入桶。

  (3)重新排列,依次比较。

3、排列的趟数等于最大数的位数

4、代码如下:

#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;
}
//每个数据 位的数 (45 0) 5  (45 1) 4
//num/pow(10.0,fin)%10
int FindFingerNumber(int num, int fin)
{
return num / (int)pow(10.0,fin) % 10;
}
//0 ,1,2(个,十,百) 0不能参与排序
void Radix(int arr[], int len, int fin)
{
int tmp[10]
= {};
int num_fin;
int count;
for (int i = 0; i < len; ++i)
{
count = 0;
num_fin = FindFingerNumber(arr[i], fin);
while (tmp[num_fin][count] != 0)
{
count++;
}
tmp[num_fin][count] = arr[i];
}
count = 0;
for (int i = 0; i < 10; ++i)
{
for (int j = 0; j < len; ++j)
{
if (tmp[i][j] != 0)
{
arr[count++] = tmp[i][j];
}
else
{
break;
}
}
}
}
//0可以参与排序
void Radix1(int arr[], int len, int fin)
{
int tmp[10]
= {};
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];
}
}
}
//每趟循环调用Radix()
void RadixSort(int arr[], int len)
{
int maxFinNum = FindMaxFinger(arr, len);
for (int i = 0; i < maxFinNum; ++i)
{
Radix1(arr, len, i);
}
}

int main()
{
int arr
= { -1,0,45, 5, 4, 12, 4, 156, 456, 465, 4, 12, 16, 6 };
int len = N;
RadixSort(arr,len);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: