Setelah mendapatkan pertanyaan ini, Anda akan berpikir untuk mengurutkan terlebih dahulu. Setelah mengurutkan, pilih angka K yang terbesar. Pilihan penyortiran Penyortiran cepat adalah pilihan yang lebih baik.
Oke, mari kita lakukan solusi pertama: quick sort
Kodenya adalah sebagai berikut
Copy kode kodenya sebagai berikut:
public static void quickSort(int[] arr, int mulai, int akhir) {
jika (mulai < akhir) {
int kunci = arr[mulai];
int kanan = mulai;
int kiri = akhir;
sementara (kanan < kiri) {
while (kanan < kiri && arr[kiri] > kunci) {
kiri --;
}
jika (kanan < kiri) {
arr[kanan] = arr[kiri];
}
while (kanan < kiri && arr[kanan] <= kunci) {
benar++;
}
jika (kanan < kiri) {
arr[kiri] = arr[kanan];
}
}
arr[kanan] = kunci;
quickSort(arr, mulai, kanan-1);
quickSort(arr, kiri+1, akhir);
}
}
Setelah pengurutan cepat, array akan terurut. Pengurutan di atas adalah dari kecil ke besar, jadi output kita akan menjadi seperti berikut
Copy kode sebagai berikut: int k = 4;
for (int i=arr.panjang-1; i>=arr.panjang-k; i--) {
Sistem.keluar.println(arr[i]+" ");
}
. Solusi pertama sudah bagus, tapi adakah cara yang lebih baik?
Jawabannya adalah ya! Kita dapat memilih pengurutan sebagian, dan kemudian kita menggunakan pengurutan pilihan untuk menyelesaikan masalah ini.
Kodenya adalah sebagai berikut:
Salin kode sebagai berikut: public static int[] selectSortK(int[] arr, int k) {
if(arr == null || arr.panjang == 0) {
kembalikan nol;
}
int[] Arr baru = int baru[k];
List<Integer> list = new ArrayList<Integer>();//Rekam subskrip dari jumlah maksimum setiap kali
untuk (int i=0; i<k; i++) {
int maxValue = Integer.MIN_VALUE; //Nilai maksimum
int indeks maksimal = saya;
untuk (int j=0; j<arr.panjang; j++) {
if (arr[j] > maxValue && !list.contains(j) ) {
nilaimaks = arr[j];
indeks maksimal = j;
}
}
if (!list.contains(maxIndex)) {//Jika tidak ada, tambahkan
daftar.tambahkan(maxIndex);
Arr baru[i] = nilai maksimal;
}
}
kembalikan Arr baru;
}