Encuentra el número K-ésimo más grande

Descripción del Título

Hay una matriz de enteros. Busque el número K-ésimo más grande en la matriz de acuerdo con la idea de clasificación rápida.
Dada una matriz de enteros a, dado su tamaño ny la K que está buscando (K está entre 1 y n), devuelva el número Kth más grande para asegurarse de que existe la respuesta.


Entrada de ejemplo :

[1,3,5,2,2],5,3

Producción:

2

Idea 1: Lo
primero que me viene a la mente es ordenar la matriz primero y luego generar el subíndice del número Kth desde la parte inferior = la longitud de la matriz-k;

Entonces, la pregunta se descompone directamente en la pregunta de cómo ordenar la matriz. La primera es usar directamente la API oficial de Java, Arrays.sort (matriz); para ordenar. Aunque la respuesta obtenida de esta manera es correcta, la pregunta requiere Es la idea de utilizar la clasificación rápida.

 public static  int findKth(int[] a, int n, int K) {
    
    
        if(K>n)
            return 0;
        Arrays.sort(a);
        return a[n-K];
    }

Idea 2:
utilice la idea de
la clasificación rápida para clasificar los elementos de la matriz: la idea de la clasificación rápida se divide principalmente en tres partes:
(1) Encuentre el valor de referencia;
(2) Parte de la partición (método Hoare, método de excavación, frente y método de recorrido hacia atrás)
(3 ) ) Clasifique los subintervalos izquierdo y derecho por separado;

//交换两个数字
public static void swap(int[] array,int index1,int index2){
    
    
        int tmp=array[index1];
        array[index1]=array[index2];
        array[index2]=tmp;
    }
    //partition部分
    public static int partition(int[] array,int lowIndex,int highIndex){
    
    
        int leftIndex=lowIndex;
        int rightIndex=highIndex;
        //作为基准值的是最左边的一个数
        int key=array[lowIndex];
        while(leftIndex<rightIndex){
    
    
            while(leftIndex<rightIndex&&array[rightIndex]>=key){
    
    
                rightIndex--;
            }
            while(leftIndex<rightIndex&&array[leftIndex]<=key){
    
    
                leftIndex++;
            }
            //否则就进行交换
            swap(array,leftIndex,rightIndex);


        }
        swap(array,lowIndex,leftIndex);
        return leftIndex;
    }
    //快排具体实现部分
    public static void quickSortInternal(int[] array,int lowIndex,int rightIndex){
    
    
        int size=rightIndex-lowIndex+1;
        if(size<=1){
    
    
            return ;
        }
        //对左右两个区间分别进行排序
        int keyIndex=partition(array,lowIndex,rightIndex);
        quickSortInternal(array,lowIndex,keyIndex-1);
        quickSortInternal(array,keyIndex+1,rightIndex);
    }
    public static void quickSort(int[] array){
    
    
        quickSortInternal(array,0,array.length-1);

    }

    public static  int findKth2(int[] a, int n, int K) {
    
    
        //利用快排先进行数组元素的排序
        quickSort(a);
        return a[n-K];
    }

Supongo que te gusta

Origin blog.csdn.net/m0_46551861/article/details/115023449
Recomendado
Clasificación