线性时间排序-计数排序

计数排序:

基本思想:对每一个输入元素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]]-- ; 
	}
}




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值