最快的算法而且不用递归!运行时间是线性的!
来源:互联网 发布:淘宝店铺服务态度 编辑:程序博客网 时间:2024/06/17 23:10
下面我要来介绍一下计数算法:
这个算法的运行时间是线性的!这可是非常的难得!所以应该归于最快的算法之列,而且由于没有使用递归,使得对系统的资源占用也不大,但还是有缺点的,缺点之一就是它不属于原址排序,但它是稳定的。即输出顺序严格按照输入的顺序,即使是相同元素!常用于基数排序。以下内容摘自《算法导论》计数顺序的基本思想是:
对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上了。例如,如果有17个元素小于x,则x应该在第18个输出位置上。当有几个元素相同时,这一方案仍成立。
下面是一个C语言版本的实例:
/*下面宏定义中M代表输入数组元素中的最大值,N代表输入数组的实际长度计数排序原理:一个数组的位置是根据它前面有多少个数是小于它的,例如有14个数小于它,那么它的位置就应该在第15个位置,反之按从大到小排也是同样的原理*/#include "stdio.h"#include "conio.h"#include "string.h"#define M 8#define N 10/*计数排序,运行时间:n ,堪称是最快的排序算法,而且不需要递归唯一的缺点是不是原址排序,因为需要临时数组k代表输入数组中的元素中最大值*/void count_sort(int A[],int B[]){ int c[M+1]; int i=0; for(i=0;i<=M;i++) /*必须对c[]进行初始化为0*/ { c[i]=0; } for(i=0;i<N;i++) { c[A[i]]=c[A[i]]+1; } for(i=1;i<=M;i++) /*统计前面有多少个数是小于下标为i的数*/ c[i]=c[i]+c[i-1]; for(i=N-1;i>=0;i--) { B[c[A[i]]]=A[i]; c[A[i]]--; }}main(){ int a[N]={2,5,4,3,0,2,8,1,6,7},b[N+1],i; count_sort(a,b); printf("利用计数算法排序好的数组如下\n"); for(i=1;i<=N;i++) /*0号元素坚决不能用!*/ printf(" %d ",b[i]); getch();}
- 最快的算法而且不用递归!运行时间是线性的!
- 递归的运行时间,及Fibonacci的递归算法复杂度
- 递归式的运行时间
- 线性时间的排序算法
- 线性时间的选择算法
- 递归算法的时间复杂度
- 递归算法的时间复杂度
- 递归算法的时间复杂度
- 最快的开方算法
- 时间复杂度最快的排序算法 O(n) JAVA代码
- 能是最快的算法alpha blend汇编源代码
- 无限极分类这个是不用递归查询的
- 用最快的时间读书
- 最快的高斯模糊(线性时间)Fastest Gaussian Blur (in linear time)
- 选择问题的线性期望时间算法
- 两个线性时间解决的算法题
- 主元素问题的线性时间算法
- 线性时间的中位数查找算法
- 配置p4merge for git on ubuntu
- 新的开始!!!
- jQuery $.post $.ajax用法
- 分治排序(有哨兵位)
- ubuntu 系统资源监控
- 最快的算法而且不用递归!运行时间是线性的!
- 求职路杭州11月份面试题
- linux内核hmac-sha1使用
- 子视图的插入、删除
- 关于指针
- RelativeLayout的一些属性设置
- 静态库、动态库
- java中的值传递和引用传递
- 一种不使用字符串检验一个整数是否包含一个整数的c#实现方法