O(n)复杂度实现寻找数组第k小的数(快速选择算法)
非堆排序实现,利用快速排序思想实现的快速选择
package algorithm;
public class Test {
public int quickSelect(int nums[], int left, int right, int k){
if (left == right) return nums[left];
int i = left - 1, j = right + 1, x = nums[left];
while (i < j){
do i++; while (nums[i] < x);
do j--; while (nums[j] > x);
if (i < j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
int lenL = j - left + 1;
if (lenL >= k) return quickSelect(nums, left, j, k);
else return quickSelect(nums, j + 1, right, k - lenL);
}
public static void main(String[] args) {
int[] nums = new int[]{0, 1, 0, 3, 12};
Test test = new Test();
System.out.println(test.quickSelect(nums, 0, nums.length - 1, 3));
}
}
图示: