原理:需要创建一个临时数组,存放出现的次数。等所有元素都计数完成后,迭代临时数组构建排序后的结果。
function countingSort(array) { if (array.length < 2) { // 如果待排序数组为空或只有一个元素,则不需运行排序 return array; } const maxValue = Math.max(...array); // {2} 从索引0开始,找到数组中的最大值 const counts = new Array(maxValue + 1); // {3} 创建计数数组,比如最大值为3,则创建4个,最后一个下标为3 array.forEach((element) => { if (!counts[element]) { // {4} 如果计数某个元素一开始没有初始化,则赋值为0 counts[element] = 0; } // 给计数数组对应的下标加 counts[element]++; // {5} }); // 辅助索引,帮助我们将值赋值到结果数组中的正确位置 let sortedIndex = 0; counts.forEach((count, i) => { while (count > 0) { // {6} array[sortedIndex++] = i; // {7} count--; // {8} } }); return array; } console.log(countingSort([3,5,1,9,2]));
满足下列2点可以最大程度发挥计数排序的优势