在实际工作中,我们时常会有寻找长度为n的数组中,排在前k的元素,对于top k的问题,最暴力的处理方式就是直接对数组进行排序,然后再去截取前k个数字,从而达到自己的目的,这种算法的实现复杂度为O(nlogn),其实有O(n)的算法或者是O(nlogk)时间复杂度的算法。
基于快排的top k算法
如果我们了解快速排序算法的话,知道其原理是每次寻找一个数值,将数组中所有小于这个数的值放在其左侧,所有大于其数值的数放在其右侧。因此调用一次partion之后,设其返回值为p,则比第p个数字小的所有数字在数组的左侧,比第p个数字大的所有数字都在数组的右侧。我们可以基于快排的原理用其实现寻找top k的元素。我们看下代码,其时间复杂度为O(n)。
private static int partion(int[] array, int low, int high) {
int mid = array[low];
while (low < high) {
while (low < high && array[high] >= mid)
high--;
array[low] = array[high];
while (low < high && array[low] <= mid)
low++;
array[high] = array[low];
}
array[low] = mid;
return low;
}
private