排序算法(6):计数排序(Counting Sort)

1,099 阅读2分钟

基本思想

计数排序是一个非基于比较的排序算法,是一种空间换时间的算法,是通过元素的值来确定元素的位置,适用于非负整数的排序

算法描述

  • 找出原数组中元素值最大的,记为 max
  • 创建一个新数组 count ,其长度是 max 加 1,其元素默认值都是0
  • 遍历原数组中的元素,以原数组中的元素作为count数组的索引,以原数组中的元素出现次数作为count数组的元素值。
  • 创建结果数组result,起始索引index
  • 遍历count数组,找出其中元素大于0的元素,将其对应的索引作为元素值填充到result数组中,每处理一次,count中的元素值减1,直到该元素值不大于0,依次处理count中剩下的元素
  • 返回结果数组result

演示

代码实现

	public static void sort(int[] array) {
		int temp = array[0];
		for (int i = 1; i < array.length; i++) {
			if (array[i] > temp) {
				temp = array[i];
			}
		}
		int[] tempArray = new int[temp + 1];

		for (int i = 0; i < array.length; i++) {
			tempArray[array[i]]++;
		}

		int tempIndex = 0;
		for (int i = 0; i < tempArray.length; i++) {
			for (int j = 1; j <= tempArray[i]; j++) {
				array[tempIndex++] = i;
			}
		}
	}

时间复杂度

k代表数值中的位数
最佳情况:O(n+k)
最坏情况:O(n+k)
平均情况:O(n+k)

空间复杂度

假设n个记录中每个关键字都介于0到k-1之间,则空间复杂度:n+O(k)

优点与缺点

  • 优点:实现简单,排序速度快于任何比较排序
  • 缺点:适用范围有局限性(非负整数),对数量级较少的整数排序很实用,数量级过大时可能会造成堆栈溢出

测试记录

待补充

源码

暂时未发现在开源框架或jdk中用到插入排序