给定一组N个数,找出其中第k个最大数?
最直观的做法是对这N个数进行降序排序,然后输出第k个数即可。
另一种是构建一个临时数组存放取出k个数,进行降序排序,然后依次读取剩余的数,比较其与临时数组中的第k个数,若小则放弃,否则安装选择排序的思路对该数进行排序,最后将最后的一个数移除,使得数组始终保持在k个,则最终的结果即是临时数组的第k个数。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| var input = []; var max = 10; for (var m = 0; m < max; m++) { input.push(Math.floor(Math.random() * max)); } console.log('full input array: ' + input); var temp = []; var k = Math.floor(input.length / 2); var i,j; for (i = 0; i < k; i++) { temp.push(input.pop()); } temp.sort(function(v1, v2) {return v2 - v1;}); console.log('Get the k elements and sort them: ' + temp); console.log('Last some elemenets which will be inserted in temp: ' + input); input.forEach(function(item) { if (item > temp[k - 1]) { for (j = k - 1; temp[j] < item; j--) temp[j+1] = temp[j]; temp[j+1] = item; temp.pop(); console.log('every time insert into a new element, the results is: ' + temp); } }); console.log(temp); console.log(temp[k - 1]);
|
上面代码中注释的地方是容易出错的地方,需要好好体会。
上面这两种方法在输入数据少的时候,效果还可以,但是当数据量超大了,就不能短时间内给出结果了,所以这两种方法都不算好的算法。