基数排序
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; }
相关文章推荐
- (转)Android和JavaScript互相调用
- 重新拾取的jquery
- Ubtun的内存CPU上传下载速率读取-qt
- BDF2-JAVA代码以及view页面获取当前登录用户的信息
- Fragment生命周期
- HDOJ 1175 连连看(BFS)
- Spring 配置文件模板
- 使用Gradle发布SNAPSHOT版本到JCenter(oss.jfrog.org)
- 用Dotfuscator对dll混淆
- Android 屏幕适配方案
- Apache2.2+Tomcat7.0集群 完美攻略
- 使用Gradle发布SNAPSHOT版本到JCenter(oss.jfrog.org)
- eclipse js提醒报错
- 024找到二维阵列(keep it up)
- BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )
- 如何教你在NIPS会议上批量下载历年的pdf文档(另附04~14年NIPS论文下载链接)
- C/C++之全局、static对象/变量的初始化问题
- C/C++之内存对齐
- usb driver编写 (转)
- java socket初步学习一 ( tcp)