计数排序

/*
	计数排序需要占用大量空间,它仅适用于数据比较集中的情况。比如 [0~100],[10000~19999] 这样的数据。
	计数排序是桶排序的一种特殊情况,可以把计数排序当成每个桶里只有一个元素的情况。
计数排序的基本思想是:对每一个输入的元素arr[i],确定小于 arr[i] 的元素个数。
	所以可以直接把 arr[i] 放到它输出数组中的位置上。假设有5个数小于 arr[i],
	所以 arr[i] 应该放在数组的第6个位置上。
	计数排序只能适用于数据表 
	所以它具有局限性
	比如:hah 6  xixi 6  hehe 7 enen 7 这些名字对应着有重复的成绩 你怎么排序并且输出谁是谁呢?
	计数排序是计算排序构造了k个buckets来统计数据频次,
	共需要两趟来实现排序,第一趟增量计数进行统计,
	第二趟将计数统计的对应的数重写入 原始数据表 中。
	或者我们说也可以新的数组存储 但是其实没必要 
*/ 
#include<stdio.h>
void print(int *a){
	int i;
	for(i = 0; i < 9;i++){
		printf("%d ",a[i]);
	}
	printf("%d\n",a[i]);
} 
int main(){
	int i,j,index = 0;
	int a[10] = {5,9,3,9,10,9,2,4,13,10};//10
	printf("原序列:");
	print(a);
	int min,max; 
	min = max = a[0];//初始化
	for(i = 1; i < 10; i++) {
        min = (a[i] < min) ? a[i] : min;
        max = (a[i] > max) ? a[i] : max;	
	} 
	int blen = max-min+1;
	int book[blen];	//计数数组初始化0 
	for(i = 0; i< blen; i++)
		book[i] = 0;
	for(i = 0; i < 10; i++)		//计数 
		book[a[i] - min]++;
	for(i = min; i <= max; i++) 	//重新赋给原始数据表 只是通过计数数组按顺序赋值 
        for(j = 0; j < book[i - min]; j++) 
			a[index++] = i;
	printf("排序后元素如下:");
	print(a);
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值