简直了,我不适合快速排序,我喜欢优先级队列 o(╥﹏╥)o

1、快速排序

  • 1、先找到一个中轴位置(比如第一个),从中轴位置后一个开始循环
  • 2、从左往右,直到找到一个比中轴位置元素大的数,记住它的位置i,此时它左边都是比中轴元素小的数
  • 3、从右往左,直到找到一个比中轴元素小的数,记住它的位置j,此时它右边都是比中轴元素大的数
  • 4、只要i的位置在j之前,交换i和j,使得当前i和i的左边都是比中轴元素小的数,j和j的右边都是比中轴元素大的数
  • 5、重复2-4
  • 6、跳出循环时,i的位置或等于j或大于j,且i及i的左边都比中轴元素小,j及j的右边都比中轴元素大,但是由于i的位置可能会大于j,所以交换j和中轴元素
import java.util.*;

public class Solution {
        public int findKth(int[] a, int n, int K) {
           int[] mid = quickSort(a,  0, a.length - 1);
        
            return mid[a.length-K];
    }

    public static int[] quickSort(int[] arr, int left, int right) {
        if (left < right) {
            //获取中轴元素所处的位置
            int mid = partition(arr, left, right);
            //进行分割
            arr = quickSort(arr, left, mid - 1);
            arr = quickSort(arr, mid + 1, right);
        }
        return arr;
    }

    private static int partition(int[] arr, int left, int right) {
        //选取中轴元素
        int pivot = arr[left];
        int i = left + 1;
        int j = right;
        while (true) {
            // 向右找到第一个小于等于 pivot 的元素位置
            while (i <= j && arr[i] <= pivot) i++;
            // 向左找到第一个大于等于 pivot 的元素位置
            while(i <= j && arr[j] >= pivot ) j--;
            if(i >= j)
                break;
            //交换两个元素的位置,使得左边的元素不大于pivot,右边的不小于pivot
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        arr[left] = arr[j];
        // 使中轴元素处于有序的位置
        arr[j] = pivot;
        return j;
    }

}

2、优先级队列

  • 优先级队列实现了Comparator接口,默认对自然数进行有序排序,最小的在队首
int[] a = {1,3,5,78,4,2,64,2,6,4,3,7,3,4};
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        int k = 8;
        for(Integer n:a){
            if(queue.size()<=k){
                queue.add(n);
            }else{
                if(queue.peek()<n){
                    queue.poll();
                    queue.add(n);
                }
            }
        }
        System.out.println(queue.peek());