每日算法题:19.6.12

计数排序法

算法概述:

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。
计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。

算法过程:

 找出待排序的数组中最大和最小的元素;
 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。

时间复杂度:

最佳情况:T(n) = O(n+k)  最差情况:T(n) = O(n+k)  平均情况:T(n) = O(n+k)

代码:

public class Test16 {
	public static void main(String[] args) {
		int[] array = {13,1,2,10,8,12,4,4,1,1,1,1,12,13};
		
		//排序
		sort(array);
		
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i]+" ");
		}
	}
	
	public static void sort(int[] array){
		//获取数组最大的数和最小的数
		int min = array[0];
		int max = array[0];
		for (int i = 0; i < array.length; i++) {
			if (array[i]<min) {
				min  =array[i];
			}
			if (array[i]>max) {
				max = array[i];
			}
		}
		
		//根据最大值和最小值初始化一个临时数组
		int[] temparray = new int[max-min+1];
		Arrays.fill(temparray, 0);
		
		//将目标数组中元素的大小和临时数组的下标进行比较,将对应的计数+1
		for (int i = 0; i < array.length; i++) {
			temparray[array[i]-1]++;
		}
		
		//根据临时数组下标和对应的计数大小对目标数组进行重新赋值
		int j = 0;
		for (int i = 0; i < temparray.length; i++) {
			while(temparray[i]>0){
				array[j++] = min+i;
				temparray[i]--;
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值