最快的算法而且不用递归!运行时间是线性的!

来源:互联网 发布:淘宝店铺服务态度 编辑:程序博客网 时间: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();}


原创粉丝点击