昨天讲了如何实现查找第K大的元素,要求时间复杂度为O(n);
那么就是利用快速排序的算法,今天我就利用java,来实现时间复杂度为O(n),查找第k大的值;
// 找出第k大,就是找出arr.length-k+1小的值;
@Test
public void fun1() {
int[] arr = {1, 2, 7, 4, 4, 5, 6, 2, 11, 5, 6, 3};
int k = 4;
int key = findK1(arr, 0, arr.length - 1, arr.length - k + 1);
System.out.println(key);
}
// 通过debug一步一步开执行过程
private int findK1(int[] arr, int start, int end, int k) {
int low = start;
int high = end;
int key = arr[end];
while (low != high) {
while (low < high && arr[low] <= key) {
low++;
}
while (low < high && key <= arr[high]) {
high--;
}
if (low != high)
swap(arr, low, high);
}
swap(arr, low, end);
if (k == low + 1) {
return key;
} else if (low + 1 > k) {
return findK1(arr, start, low - 1, k);
} else {
return findK1(arr, low + 1, end, k);
}
}
平均时间复杂度为:O(n)
最大时间复杂度为:O(n^2)
空间复杂度为:O(1)