第三章:查找与排序(下)----------- 3.19 计数排序

本文深入讲解计数排序算法,探讨其工作原理、优缺点及适用场景。通过实例演示计数排序过程,分析其时间与空间复杂度,并讨论优化策略。

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

计数排序 

一句话:用辅助的数组对数组中出现的数字计数,元素转下标,下标转元素。

假设所有元素均大于等于0,依次扫描原数组,将元素值k记录在辅助数组的k位上。

依次扫描辅助数组,如果为1,将其插入目标是数组的空白位处。

问题:

-----重复元素

-----有负数

优点:快;(可以说是最快的排序算法,没有比较,直接映射)

缺点:数据范围很大,比较稀疏,会导致辅助空间很大,也稀疏,造成空间的浪费。

#include<iostream>
using namespace std;

void countSort(int arr[],int length){
	int maxL=arr[0];
	//求原数组元素中的最大值 
	for(int i=1;i<length;i++){
		maxL=max(maxL,arr[i]);
	} 
	
	int helper[maxL+1];
	//辅助数组赋初值为0	
	for(int i=0;i<=maxL;i++){
		helper[i]=0;
	}
	//遍历原数组,元素转下标,若出现,则对应位置元素+1
	for(int i=0;i<length;i++){
		helper[arr[i]]++;
	} 
	
	int current=0;//数据回填的位置
	for(int i=1;i<=maxL;i++){
		while(helper[i]>0){
			arr[current++]=i;  //下标转元素
			helper[i]--; 
		}
	} 
}

int main(){
	int arr[]={6,2,5,8,2,1,9,5,6};
	int len= 9;
	
	countSort(arr,len);
	for(int i=0;i<len;i++){
		cout<<arr[i]<<" ";
	}
	return 0;
} 

时间复杂度:扫描一次source,扫描一次helper,复杂度为N+k;

空间复杂度:辅助空间k,k=maxOf(source);

非原址排序;

如果要优化一下空间,可用求minOf(source),helper的长度为max-min+1,这样能短点;

计数有缺陷,数据较为密集或者范围较小是,适用。

 结果:

NOTICE:

 计数排序,适用数据范围小,且范围已知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值