您的位置:首页 > Web前端 > JavaScript

js算法:计数算法 counting sort

2016-06-30 10:17 302 查看
// 计数排序 count sort

/**
*	使用count sort基本原理
*
*  已知要排序的数字在一个区间中(如 0..k),这样我们就可以计算出来 A[0...n]中的某一项A[i]有多少个数小于它,进而得知它应该
*  放到排好序数组的第多少个位置 A[2,3,5,4,8,7,6,9,1,0] 如A[7] = 9 因为比9小的数字有9个,
*  所以我们知道9应该放到排好序的数组B[0..9]的第9个位置
*/

'use strict';

/**
*	arr是原数组, sortedArr排好序数组, k待排序数字的最大范围
*/
function countSort(arr, sortedArr, k) {
let tmpArr = [];
//初始化tmpArr值全为0,长度为k+1,因为有0
for(var i=0; i<=k; i++) {
tmpArr[i] = 0;
}

//计算待排序的数组arr,每一项的数字出现的次数
for(var j=0, jj=arr.length; j<jj; j++) {
tmpArr[arr[j]] = tmpArr[arr[j]] + 1;
}

//统计有多少小于等于arr[i]的数字
for(var i=1; i<=k; i++) {
tmpArr[i] = tmpArr[i] + tmpArr[i-1];
}

//对arr进行排序
if (!sortedArr) {
sortedArr = [];
}
for(var j=0, jj=arr.length; j<jj; j++) {
var idx = arr[j];
sortedArr[tmpArr[idx]-1] = idx;
//此处切记要递减,因为有可能arr中有数字重复的,如果数字重复第二次出现的数字,
//我们放到计算出来的位置的前一个,如果第三次出现,则前二个,以此增加
tmpArr[idx] = tmpArr[idx] - 1;
}
}

let arr = [1,5,4,8,7,9,6,5,4,3,2,0];
console.info("原数组:", arr);
let sortedArr = [];

countSort(arr, sortedArr, 9);
console.info("排序后:", sortedArr);

//运行输出结果:node count-sort.js
//原数组: [ 1, 5, 4, 8, 7, 9, 6, 5, 4, 3, 2, 0 ]
//排序后: [ 0, 1, 2, 3, 4, 4, 5, 5, 6, 7, 8, 9 ]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息