计数排序
2014-05-11 17:04
183 查看
计数排序的基本思想:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它的输出数组中的位置上了。首先利用一个辅助数组,数组大小是所有元素的最大值K+1,C[0....K],数组下标就是对应的元素。统计每个元素出现的次数存入数组C,然后计算每个元素前面替他元素出现的个数。将数组A的元素根据数组C的信息按顺序排列在输出数组B上。
计数排序算法的时间复杂度为O(n+k),当k较小时,即元素的最大值较小,k = O(n)时, 这时运行时间为O(n)。
#include <stdio.h> #include <malloc.h> void Count_sort(int A[], int B[], int k, int length) { int i = 0; /*统计每个元素出现次数的临时辅助数组,下标对应元素的值*/ int *C = (int *)malloc( sizeof(int) * (k+1) ); if( C != NULL ) { for(i=0; i <= k; i++) { C[i] = 0; //初始化为0 } } else return; for(i=0; i < length; i++) { C[A[i]] += 1; //统计每个元素出现的次数 } for(i=1; i <= k; i++) { C[i] += C[i-1]; //计算每个元素前面有多少其他的元素 } /*从数组A的最后一个元素开始排列,寻找对应的位置即C[A[i]-1]为下标位置 放入数组B*/ for(i = length-1; i >= 0; i--) { B[ C[ A[i] ] - 1 ] = A[i]; C[ A[i] ] -= 1; } free(C); } int main(int argc, char *argv[]) { int i = 0; int A[] = {5, 2, 4, 6, 1, 3, 1, 1, 23, 45, 22, 0, 4}; int length = sizeof(A) / sizeof(A[0]); int *B = (int *)malloc(sizeof(int) * length); Count_sort(A, B, 50, length); for(i=0; i < length; i++) { printf("%d ", B[i]); } free(B); printf("Press enter to continue ..."); getchar(); return 0; }
计数排序算法的时间复杂度为O(n+k),当k较小时,即元素的最大值较小,k = O(n)时, 这时运行时间为O(n)。
相关文章推荐
- 递归
- 如何将视差数据保存为 txt 数据文件以便在 Matlab 中读取分析?
- c++11 中auto 相当方便
- 电脑硬盘分区为何从C盘开始?A和B盘呢?
- 数据结构 树(二叉树 链式存储)
- 对象数组操作长方柱类
- C27_OC17-日期类型NSDate
- .net 错误处理
- hash poj_1200 Crazy Search
- 20140511 科技脉搏 -中国互联网正在全面接管中国经济?
- eclipse安装Flash Builder 4后变成中文,怎么解决
- Leetcode 树 Same Tree
- linux下的基本命令
- 命令行执行python模块时提示包找不到的问题
- C26_OC16-OC类型包装
- 小总结
- 不容易系列之(4)——考新郎 杭电 acm 2049 Java
- iftop和iostat安装和简单使用
- 0012-APK-Activity-Wallpaper
- Android文件系统的结构及目录用途、操作方法