Java数据结构——计数排序

基本思想:

计算待排序数组的最大值和最小值

以此建立一个计数数组,用于保存待排序数组中不同元素出现次数

遍历计数数组,按照不同元素的出现次数重新填充有序数组

比如数组3 1 3 5 4 3 7 6

得到计数数组为1 0 3 1 1 1 1

此时计数数组的每个元素下标,加上待排序数组最小值,即为该元素值

也就是说,可以得到1出现次数为1,2出现次数为0,3出现次数为3,以此类推

故计算得有序数组为1 3 3 3 4 5 6 7


代码实现:

//计数排序
public void countSort() {
	int min = array[0];
	int max = array[0];
	int arrayIndex = 0, countIndex = 0;
	for (int i = 1; i < array.length; i++) {
		if (array[i] > max)
			max = array[i];
		if (array[i] < min)
			min = array[i];
	}
	int[] countArray = new int[max - min + 1];
	for (int i : array) {
		countArray[i - min]++;
	}
	while (arrayIndex < array.length) {
		if (countArray[countIndex] != 0) {
			array[arrayIndex] = countIndex + min;
			countArray[countIndex]--;
			arrayIndex++;
		} else {
			countIndex++;
		}
	}
}

时间复杂度:O(n + k),k为待排序数的范围,即最大值与最小值之差

空间复杂度:因为需要额外开辟一个长度为k的数组用于计数,故空间复杂度为O(n + k)

稳定性:计数排序是稳定的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值