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

本文深入探讨了计数排序算法的核心思想、原理及其实现过程,包括其线性运行时间、稳定性特点以及与其他排序算法的区别。通过C语言实例展示如何实现计数排序,并解释了其在基数排序中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值