Description du titre
Il existe un tableau d'entiers. Veuillez trouver le K-ième plus grand nombre dans le tableau en fonction de l'idée du tri rapide.
Étant donné un tableau d'entiers a, étant donné sa taille n et le K que vous recherchez (K est compris entre 1 et n), veuillez renvoyer le Kème plus grand nombre pour vous assurer que la réponse existe.
Exemple d'
entrée:
[1,3,5,2,2],5,3
Sortir:
2
Idée 1: La
première chose qui me vient à l'esprit est de trier d'abord le tableau, puis de sortir l'indice du nombre Kième à partir du bas = la longueur du tableau-k;
La question est donc directement décomposée en la question de savoir comment trier le tableau. La première consiste à utiliser directement l'API Java officielle, Arrays.sort (array); pour le tri. Bien que la réponse obtenue de cette manière soit correcte, la question nécessite C'est l'idée d'utiliser le tri rapide.
public static int findKth(int[] a, int n, int K) {
if(K>n)
return 0;
Arrays.sort(a);
return a[n-K];
}
Idée 2:
Utilisez l'idée du tri
rapide pour trier les éléments du tableau: L'idée du tri rapide est principalement divisée en trois parties:
(1) Trouver la valeur de référence;
(2) Partie de partition (méthode Hoare, méthode de creusement, avant et méthode de traversée arrière)
(3 ) ) Trier les sous-intervalles gauche et droit séparément;
//交换两个数字
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];
}