基数排序(C语言版本)
2017-07-11 21:44
155 查看
基本思想:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
代码:
代码:
#include<stdio.h> #include<windows.h> int getWidth(int *a,int n) { int flag = a[0]; int i; for(i=1;i<n;i++) { if(flag<a[i]) flag = a[i]; } int time=0; while(flag>0) { flag = flag/10; time++; } return time; } /* *获取一个数第d位数的值,位数索引从0开始 */ int getValue(int value, int d) { for (;d > 0 && value > 0; d--) { value = value /10; } return value % 10; } //桶操作 void innerCountingSort(int a[], int n, int d) { int i,flag,j,k=0; int b[10]; for(i=0;i<10;i++) { b[i] = 0; } int **p = (int **)malloc(10*sizeof(int *)); for(i=0;i<10;i++) { p[i] = (int *)malloc(n*sizeof(int)); } for(i = 0; i < n; i++) { flag = getValue(a[i], d); p[flag][b[flag]++] = a[i]; } for(i=0;i<10;i++) { for(j=0;j<b[i];j++) { a[k++] = p[i][j]; } } for(i=0;i<10;i++) { free(p[i]); } free(p); } //基数排序函数 void radixSort(int a[], int n,int width) { int i; for (i = 0; i < width; i++) { innerCountingSort(a, n, i); } } int main() { int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; int n= 28; int i; for(i=0;i<n;i++) { printf("%d\t",a[i]); } printf("\n\n"); //确定数组中的最高位 int width; width = getWidth(a,n); radixSort(a,n,width); for(i=0;i<n;i++) { printf("%d\t",a[i]); } printf("\n"); system("pause"); return 0; }
相关文章推荐
- 237. Delete Node in a Linked List(C语言版本)
- 设计模式 行为模式 中介者模式 c语言 版本实现
- 232. Implement Queue using Stacks(C语言版本)(Time Limit Exceeded)
- 【补充】C语言的发展及其版本
- 线性表玩具之链表版本(C语言)
- 541. Reverse String II(C语言版本)
- c语言实现动态版本通讯录
- 生成UUID算法的C语言实现-win32版本
- 【转载】MFCC特征提取(C语言版本)
- c语言之ls目录的简单实现和window版本dirent.h
- MD5测试程序(C语言版本)
- 用libev的c语言版本实现简单的网络通信服务器
- Linux grep命令分析以及C语言版本的实现
- MFCC特征提取(C语言版本)
- 实现一个通用的生产者消费者队列(c语言版本)
- C语言的发展及其版本
- C语言的标准版本
- 操作系统课程设计-二级文件系统,Windows平台版本,c语言
- 设计模式初探 行为模式 观察者模式 c语言 版本实现
- 一个UUID生成算法的C语言实现——WIN32版本