桶排序和基数排序(熟练掌握代码中结构体的使用trick)
2015-03-19 00:01
711 查看
1.桶排序
2.基数排序
参考资料:http://blog.csdn.net/cjf_iceking/article/details/7943609
http://blog.csdn.net/houapple/article/details/6480100
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 10 struct 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
相关文章推荐
- 使用 JET 在 Eclipse 中创建更多更好的代码,如何掌握专家的最佳实践并提高您的模型驱动开发进度
- 您希望通过将所有ArrayList对象替换为相应的泛型版本以提高应用程序的效率,并使得代码更易于使用。当结构体或其他值类型存储在这些数据结构中时,会导致装箱/拆箱操作,这时就需要这么做。
- JUnit4 使用指南二 (熟练掌握)
- 基础篇:2.熟练掌握相关监听器的注册和使用
- 基础篇:3.熟练掌握Activity的生命周期和使用方法
- 基础篇:4.熟练掌握BroadcastReceiver的接收和使用
- JsonModel的使用(ios程序员必须熟练掌握,太激动了)
- 掌握四点,才敢在简历上写熟练使用word<摘要>
- 对于自己来说,面试时间需要熟练使用的几段代码(1)
- 状态栏和navigationbar 关联上,结构体总是通过被复制的方式在代码中传递,因此请不要使用引用计数。
- 桶排序与基数排序代码(JAVA)
- Android开发之recycleView详解代码,看完包你熟练掌握recycleView的用法。转自网络经典文章
- 基本排序算法--基数排序(参考桶排序,此处只复制代码)
- 熟练掌握camtasia studio屏幕录制软件使用-camtasia studio微课教程9
- 掌握19条命令,熟练使用Linux操作系统
- SYD8801代码解析【BLE_SendData函数gap_att_report结构体设置】【蓝牙广播的实现】【协议栈回调事件】【自动睡眠】【使用内部晶振】【蓝牙状态机的说明】【断线时重新配置IO口】
- 掌握GCD以及后台永久运行的代码 (使用GCD处理后台线程和UI线程的交互)
- Android开发之recycleView详解代码,看完包你熟练掌握recycleView的用法。转自网络经典文章
- Xcode-苹果开发软件熟练使用之代码块
- 写高质量OC代码52建议总结:43.掌握GCD及操作队列的使用时机