问答题1084/1593请手写“计数排序”

难度:
2021-07-17 创建

参考答案:

算法简介

计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。

算法描述

具体算法描述如下:

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

代码实现

1function countingSort(array) { 2 var len = array.length, 3 B = [], 4 C = [], 5 min = max = array[0]; 6 console.time('计数排序耗时'); 7 for (var i = 0; i < len; i++) { 8 min = min <= array[i] ? min : array[i]; 9 max = max >= array[i] ? max : array[i]; 10 C[array[i]] = C[array[i]] ? C[array[i]] + 1 : 1; 11 } 12 for (var j = min; j < max; j++) { 13 C[j + 1] = (C[j + 1] || 0) + (C[j] || 0); 14 } 15 for (var k = len - 1; k >= 0; k--) { 16 B[C[array[k]] - 1] = array[k]; 17 C[array[k]]--; 18 } 19 console.timeEnd('计数排序耗时'); 20 return B; 21} 22var arr = [2, 2, 3, 8, 7, 1, 2, 2, 2, 7, 3, 9, 8, 2, 1, 4, 2, 4, 6, 9, 2]; 23console.log(countingSort(arr)); //[1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 6, 7, 7, 8, 8, 9, 9] 24

算法分析

当输入的元素是n 个0到k之间的整数时,它的运行时间是 O(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。

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

最近更新时间:2024-07-22

赞赏支持

预览

题库维护不易,您的支持就是我们最大的动力!