参考答案:
计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。
具体算法描述如下:
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),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。
最近更新时间:2024-07-22