算法导论学习笔记——计数排序算法

本文深入探讨了计数排序算法的基本原理、复杂度、稳定性及其在特定情况下的高效应用,通过实例代码展示了如何使用计数排序对整数数组进行排序,并分析了算法的时间和空间效率。

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

/**
 * 计数排序假设n个输入元素中的每一个都是介于0和k之间的整数, 此处k为某个整数
 *基本思想为:对每一个输入元素经,确定出小于x的元素个数,这样就可以把x直接放到它在最终输出数组中的位置上。
 *算法复杂度为O(n+k),当k=O(n)时,其运行时间为O(n)
 *另一个特点:计数排序是稳定的,具有相同值的元素在输出数组中的相对次序与它们在输入数组中的次序相同
 */
public class CountingSort {

	/**
	 * @param a  //存放需要排序的原数组
	 * @param b  //存放排序结果的数组
	 * @param k  //a中的每个元素都介于0和k之间
	 */
	static void countingSort(int a[],int b[],int k){
		//c数组为临时存储区,c存储从0到k每个元素在a中出现的次数,故c的长度为k+1。
		int c[]= new int[k+1];
		//c[i]中存放了等于i的元素的个数(0=< i <=k)
		for(int i = 0;i<a.length;i++)
			c[a[i]]++;
		//c[i]存放小于或等于i的元素个数
		for(int i = 1;i<=k;i++)
			c[i]=c[i]+c[i-1];
		//由于c[i]存放小于等于i的元素个数,所以i应该放在b数组中的c[i]位置(由于数组从0开始,所以要减1)
		for(int r = a.length-1;r>=0;r--){
			int i = a[r];
			b[c[i]-1] = i;
			//每次c[i]减1可以保证下一个等于i的相同元素,落在b[c[i]-1]的前一个位置
			c[i]--;
		}
	}
	//测试.....
	public static void main(String[] args) {
		int a[]={2,5,3,0,2,3,0,3};
		int b[]= new int[8];
		countingSort(a,b,5);
		for(int i =0;i<b.length;i++)
			System.out.println(b[i]);
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值