TopK问题

问题描述

输入n个整数,输出其中最小的K个。

例如:输入 [1, 3, 5, 7, 2] 2 =》输出 1 2

针对TopK有很多种解法,下面介绍两种。

方法一:

把数组内数据进行排序,然后取最小的K个数。

首先,方法没问题。

但是,想一想,假如数据有好几万或者上亿条,排序消耗的时间就有点多了。如果仅仅是十几、几十条数据这种方法几乎是没问题的,但是,我们再想一想,我们有必要针对所有数据进行排序么?假如有10条数据,我们只需要最小的5条,我们只需要找出最小的5条数据出来就行了,剩下的5条数据大小我们完全可以不管。

方法二:

针对方法一的缺点,现在提出第二种方法:部分排序。

如上所说的,我们只需要找出K个最小的数据,所以可以进行部分排序。比如__简单选择排序__和__冒泡排序__,这两者每一趟都能把一个最小/最大的数据放在最终位置上,所以进行K趟就能把n个数中的前K个排序出来。

__简单选择排序__:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function select_sort(arr, K){
var len = arr.length;
var Min = 0;
if(len < K){
console.log("数组长度小于K");
return;
}
for(var i = 0; i < K; ++i){
Min = i;
for(var j = i + 1; j < len; ++j){
if(arr[j] < arr[Min]){
Min = j;
}
}
if(Min != i){
var temp = arr[Min];
arr[Min] = arr[i];
arr[i] = temp;
}
}
return arr;
}

__冒泡排序__:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function bubble_sort(arr, K){
var len = arr.length;
for(var i = 0; i < K; i++){
var flag = false;
for(var j = len - 1; j > i ; j--){
if(arr[j] < arr[j - 1]){
var temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
flag = true;
}
}
if(!flag){
break;
}
}
return arr;
}

以上。