从数组 arr[1,n] n个数中,找出最大的K个数,这个是经典的求Top K的问题 。
例如从数组 int [] arr = {3,4,5,67,34,56,3,2,4,66,546} 中找到top5的数
思路:将数组进行排序,最大个5个数即为所求的数。
代码:
import java.util.Arrays;
public class TopK1 {
public static void main(String[] args) {
int[] arr = {3,4,5,67,34,56,3,2,4,66,546};
// 数组排序
Arrays.sort(arr);
int len = arr.length;
int[] topk = new int[5];
// 数组后5个数为topk的数
System.arraycopy(arr, len-5, topk, 0, 5);
System.out.println(Arrays.toString(topk));
}
}
分析:时间复杂度为O(n*logn),时间复杂度非常高,因为要对整个数组进行排序。
思路:冒泡排序每冒泡一次就会找到一个最大的数,既最大的数在数组最大索引处,因此冒泡排序K次,既找到了Top k,而且不需要进行整个数组的排序。
代码:
import java.util.Arrays;
public class TopK2{
public static void main(String[] args) {
int[] arr = {3,4,5,67,34,56,3,2,4,66,546};
int len = arr.length;
// 5次冒泡求top 5
for (int i=0; i<5; i++) {
for (int j=0; j<len-1-i; j++) {
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
System.out.println(Arrays.toString(arr));
}
}
}
// top 5
int[] topk = new int[5];
System.arraycopy(arr, len-5, topk, 0, 5);
System.out.println(Arrays.toString(topk));
}
}
分析:时间复杂度O(n*k),将全局排序优化为局部排序。