您的位置:首页 > 其它

基数排序

2015-08-13 10:42 155 查看
基数排序又称为桶排序,是一种非比较型整数排序算法。基数排序与本系列前面讲解的七种排序方法都不同,它不需要比较关键字的大小。它是根据关键字中各位的值,通过对排序的N个元素进行若干趟“分配”与“收集”来实现排序的。

当然,这个算法思想比较好理解。但是要实现一个桶结构还是比较麻烦,因此有人通过巧妙的设计来简化了数据结构,同时也节省了空间,具体代码如下:

#include <stdio.h>
#include <stdlib.h>

int max_bit(int a[], int n)//辅助函数,求数据的最大位数
{
int digits = 1;//保存最大的位数
int i, p = 10;

for (i = 0; i < n; i++){
while (a[i] >= p){
p *= 10;
digits++;//位数加1
}
}
return digits;
}

void radix_sort(int a[], int left, int right)
{
int length = right - left + 1;  //排序数组长度
int digits = max_bit(a, length);//数据最大位数
int i, j, k, radix = 1;
int cnt[10];//计数器,记录每个桶中元素的个数
int *tmp =  (int *)malloc(length * sizeof(int));
//进行digits次排序
for (i = 1; i <= digits; i++){
//每次分配前情况计数器
for (j = 0; j < 10; j++){
cnt[j] = 0;
}
//统计每个桶中的记录个数
for (j = left; j <= right; j++){
k = (a[j] / radix) % 10;
cnt[k]++;
}
//将tmp中的位置依次分配给每个桶
for (j = 1; j < 10; j++){
cnt[j] = cnt[j-1] + cnt[j];//cnt[]中存储每个桶中末尾元素的下标
}
//将所有桶中记录收集到tmp中(从后往前)
for (j = length - 1; j >= 0; j--){
k = (a[j] / radix) % 10;
tmp[cnt[k] - 1] = a[j];
cnt[k]--;// 第k个桶的下一个存储位置
}
//将临时数组中的内容复制到原始数组中
printf("radix %4d : ", radix);
for (j = 0; j < length; j++){
a[j] = tmp[j];
printf("%4d ", a[j]);
}
printf("\n");

radix = 10 * radix;
}
free(tmp);
}

int main()
{
int a[] = {50,123,543,187,49,30,0,2,11,100};

radix_sort(a, 0, 9);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: