线性时间排序-计数排序

本文深入探讨了计数排序的基本思想、时间复杂度、空间复杂度及其代码实现,包括如何使用计数排序对整数数组进行排序。

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

计数排序:

基本思想:对每一个输入元素x,确定出小于x的元素个数。有了这一信息,就可以把x直接放到它在最终输出数组中的位置上。例如,如果有17个元素小于x,则x就属于第18个输出位置。

 

时间复杂度:O(k+n),n为输入元素个数,假设所有输入元素都不大于k。

空间方面则额外用到了两个数组,一个用来统计,一个用来存放排序结果。所以也是O(n+k) ;

 

#include<stdio.h>


#define N 50

void CountingSort(int *A,int *B,int n,int k) ;

int main(void)
{
	int i,n,k ;
	int A[N],B[N] ;

	freopen("in.txt","r",stdin) ;
	while(scanf("%d%d",&n,&k) != EOF )
	{
		for(i = 1 ; i <=n ; ++i)
		{
			scanf("%d",&A[i]) ;
		}

		printf("You have input the List:\n") ;

		for(i = 1 ; i <=n ; ++i)
		{
			printf("%-3d",A[i]) ;
		}

		CountingSort(A,B,n,k) ;

		printf("\nAfter Sort:\n") ;

		for(i = 1 ; i <= n ; ++i)
		{
			printf("%-3d",B[i]) ;
		}

		printf("\n\n") ;
	}
	return 0 ;
}

void CountingSort(int *A,int *B,int n,int k) 
{
	int i ;
	int C[N] ;	

	for(i = 0 ; i <= k ; ++i)
	{
		C[i] = 0 ; 
	}

	for(i = 1 ; i <= n ; i++)
	{
		C[A[i]]++ ; 
	}

	for(i = 1 ; i <= k ; i++ )
	{
		C[i] += C[i-1] ;
	}

	for(i = n ; i >= 1 ; --i)
	{
		B[C[A[i]]] = A[i] ; ;	
		C[A[i]]-- ; 
	}
}




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值