桶排序和基数排序(熟练掌握代码中结构体的使用trick)
来源:互联网 发布:淘宝网店怎么装修视频 编辑:程序博客网 时间:2024/05/29 19:26
1.桶排序
extern void quick_sort(int a[], int p, int q);/*桶的数目等于元素的数目,data数组的所有元素值均在[0,1)之间,所以进入桶的编号可由k = data[i] * n;来确定*/struct barrel { //每个桶的结构(每个桶最多10个元素) int node[10]; int count;}; void bucket_sort(int data[], int size) { int max, min, num, pos; int i, j, k; struct barrel *pBarrel; num = n ; //桶的个数 /*清空所有的桶*/ pBarrel = (struct barrel*)malloc(sizeof(struct barrel) * num); memset(pBarrel, 0, sizeof(struct barrel) * num); /* put data[i] into barrel which it belong to */ for (i = 0; i < size; i++) { k = data[i] * n; /* calculate the index of data[i] in barrel */ (pBarrel + k)->node[(pBarrel + k)->count] = data[i]; (pBarrel + k)->count++; } pos = 0; for (i = 0; i < num; i++) { quick_sort((pBarrel+i)->node, 0, (pBarrel+i)->count-1);/* sort node in every barrel */ for (j = 0; j < (pBarrel+i)->count; j++) { data[pos++] = (pBarrel+i)->node[j]; //所有数已经入桶,所以不怕覆盖 } } free(pBarrel); } main() { int data[] = {78, 17, 39, 26, 72, 94, 21, 12, 23, 91}, i; bucket_sort(data, int size = sizeof(data) / sizeof(int)); for (i = 0; i < size; i++) printf("%d ", data[i]); }
2.基数排序
#define RADIX_10 10#define KEY_NUM 10struct radix{ int count; //用于存储每个位子(0~9)上分配到的数字的个数 int *node;}; //这样的结构体总共有10个(每个数字每一位只可能是0~9中的一个) int GetNumInPos(int x, int pos){int tmp=1;for(int i=0;i<pos;i++) tmp*=10;return (x/tmp)%10;}void RadixSort(int *data ,int size){int pos; //int m=0; struct radix *pRadix=(struct radix*)malloc(sizeof(struct radix)*RADIX_10);memset(pRadix,0,sizeof(struct radix)*RADIX_10);for(int i=1;i<=KEY_NUM;i++){ for(int j=0;j<size;j++){ pos=GetNumInPos(data[j],i); (pRadix+pos)->node[(pRadix+pos)->count]=data[j]; (pRadix+pos)->count++; } for(int i=0,m=0;i<RADIX_10;i++){ for(int k=0;k<(pRadix+i)->count;k++){ data[m++]=(pRadix+i)->node[k]; } (pRadix+i)->count=0; //一定不要忘了清0 }} free(pRadix); }
参考资料:http://blog.csdn.net/cjf_iceking/article/details/7943609
http://blog.csdn.net/houapple/article/details/6480100
0 0
- 桶排序和基数排序(熟练掌握代码中结构体的使用trick)
- 基数排序和桶排序
- 桶排序和基数排序
- 桶排序和基数排序
- 必须掌握的八种排序(7-8)--归并排序,基数排序
- 工作与人生中应熟练掌握的七个工具
- IOS开发中必须熟练掌握的数据存储方式
- 小白也能够熟练掌握常用的数据库使用技巧
- 基数排序(桶排序)
- 基数排序(桶排序)
- 基数排序(桶排序)
- 桶排序(基数排序)
- 基数排序(桶式排序的扩展?)
- 程序员必须掌握的8种排序算法(八):基数排序
- 桶式排序和基数排序
- 桶排序和基数排序 Java
- 【排序结构7】 基数排序
- 线性时间排序C++代码集合(计数排序,基数排序,桶排序([0~1)的浮点数))
- Swift几种简单的Web数据通讯方式
- makefile源文件收集
- *POJ 3177 Redundant Paths**
- c++基础小知识归纳总结
- 非阻塞connect编写方法介绍
- 桶排序和基数排序(熟练掌握代码中结构体的使用trick)
- 【Tools.Redis】配置
- How to setup multiple data sources with Spring and JPA
- 网购工具软件chrome扩展插件大推荐
- TCP/UDP
- iOS笔记:第四篇 C语言 流程控制
- 最大连续子序列和多解——HDU 1003 + POJ 1050
- c语言3月17日学习总结
- jquery mobile 页面缓存 导致事件无法触发