关闭

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

标签: 算法c算法导论排序算法c语言
724人阅读 评论(0) 收藏 举报
分类:

下面我要来介绍一下计数算法:

这个算法的运行时间是线性的!这可是非常的难得!所以应该归于最快的算法之列,而且由于没有使用递归,使得对系统的资源占用也不大,但还是有缺点的,缺点之一就是它不属于原址排序,但它是稳定的。即输出顺序严格按照输入的顺序,即使是相同元素!常用于基数排序。以下内容摘自《算法导论》计数顺序的基本思想是:

对每一个输入元素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();
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:164334次
    • 积分:2604
    • 等级:
    • 排名:第14054名
    • 原创:86篇
    • 转载:15篇
    • 译文:1篇
    • 评论:11条
    最新评论