基于最近连续被快排算法绊倒在初面。决定再此复述一遍:
public class QuickSort {
public void sort(int[] nums,int start, int end){
if(start>end) retun;
int left = start,right =end,key = nums[star];
int temp =0;
while(left<right){
while(left<right && nums[right]>=key){
right --;
}
while(left<right && nums[left]<=key){
left ++;
}
temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
nums[start] = nums[left];
nums[left] = key;
sort(nums,start,left-1);
sort(nums,left+1,end);
}
public static void main(String args[]) {
int a[] = {6,1,2,7,9,3,4,5,10,8};
QuickSort q = new QuickSort();
q.sort(a,0,a.length-1);
for(int i=0;i<a.length;i++){
System.out.print(a[i]);
}
}
}
口述针对TopK问题使用快排的思路
- 基于快排的思想:基准点左边的元素总是小于基准点,右边的元素总是大于基准点,所以topK问题就可以转换为找到一个基准点,他的位置在len-k的地方,初始基准点是最右边的元素。
- 如果基准点位置p大于len-k,对左边的数组进行快排,以基准点左边的元素为新的基准点,找到top(p+k-len)大的元素。
- 如果基准点位置p小于len-k,对右边的元素找到top(len-k-p)小的元素。
class Solution {
public int[] smallestK(int[] arr, int k) {
randomizedSelected(arr, 0, arr.length - 1, k);
int[] vec = new int[k];
for (int i = 0; i < k; ++i) {
vec[i] = arr[i];
}
return vec;
}
private void randomizedSelected(int[] arr, int l, int r, int k) {
if (l >= r) {
return;
}
int pos = randomizedPartition(arr, l, r);
int num = pos - l + 1;
if (k == num) {
return;
} else if (k < num) {
randomizedSelected(arr, l, pos - 1, k);
} else {
randomizedSelected(arr, pos + 1, r, k - num);
}
}
// 基于随机的划分
private int randomizedPartition(int[] nums, int l, int r) {
int i = new Random().nextInt(r - l + 1) + l;
swap(nums, r, i);
return partition(nums, l, r);
}
private int partition(int[] nums, int l, int r) {
int pivot = nums[r];
int i = l - 1;
for (int j = l; j <= r - 1; ++j) {
if (nums[j] <= pivot) {
i = i + 1;
swap(nums, i, j);
}
}
swap(nums, i + 1, r);
return i + 1;
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/smallest-k-lcci/solution/zui-xiao-kge-shu-by-leetcode-solution-o5eg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考:
- https://www.cnblogs.com/lxy-xf/p/11338652.html
- https://www.jianshu.com/p/55a1f740c8ef