Pengantar prinsip -prinsip penyortiran cepat
Penyortiran cepat adalah peningkatan penyortiran gelembung yang kami pelajari sebelumnya. Mereka semua termasuk dalam swap sorting, dan mereka semua menggunakan perbandingan dan gerakan konstan untuk mencapai penyortiran. Penyortiran cepat adalah algoritma penyortiran yang sangat efisien. Implementasinya meningkatkan jarak antara perbandingan dan pergerakan catatan, dan memindahkan catatan dengan kata kunci yang lebih besar langsung dari depan ke belakang, dan catatan dengan kata kunci yang lebih kecil langsung dari belakang ke depan, sehingga mengurangi jumlah total perbandingan dan gerakan. Pada saat yang sama, gagasan "membagi dan menaklukkan" diadopsi untuk membagi yang besar menjadi kecil, dan yang kecil menjadi yang lebih kecil. Prinsipnya adalah sebagai berikut: Untuk serangkaian catatan yang diberikan, pilih elemen benchmark, biasanya elemen pertama atau elemen terakhir dipilih, dan melalui pemindaian, urutan yang akan diurutkan dibagi menjadi dua bagian, bagian lebih kecil dari elemen patokan, dan bagian yang lebih besar dari atau sama dengan elemen benchmark. Pada saat ini, elemen benchmark berada di posisi yang benar setelah diurutkan, dan kemudian kedua bagian tersebut secara rekursif diurutkan dengan cara yang sama sampai semua catatan dalam urutan dipesan.
1. Jumlah k terkecil
Masukkan nomor N untuk menemukan angka k terkecil, misalnya, masukkan 4,5,1,6,2,7,3,8, dan angka terkecil adalah 1,2,3,4
Berdasarkan O (n), masalah ini dapat diselesaikan dengan menggunakan fungsi partai. Jika jumlah kth array disesuaikan berdasarkan nomor KTH, sehingga semua angka lebih kecil dari angka k yang terletak di sebelah kiri array, dan semua angka lebih besar dari array K yang terletak di sebelah kanan array. Setelah penyesuaian, angka K di sebelah kiri array adalah angka k terkecil, yang tidak harus dipesan.
impor java.util.scanner; kelas publik utama {public static void main (string [] args) {pemindai in = pemindai baru (system.in); int n = in.nextInt (); int k = in.nextInt (); int [] num = int [n]; int [] out = int [k]; untuk (); int [] num = int [n]; int [] out = new int [k]; untuk (); int [] num = int [n]; int [] out = new int [k]; untuk (); i = 0; i <n; i ++) {num [i] = in.nextInt ();} boolean b = getmink (n, num, k, out); if (b) {for (int i = 0; i <k; i ++) {System.out.print (out [i]+");}} {pin -uinm (i] (i] (i]+");}} {pini) {{uOnm] {oLEK (i] "); int uik, int [] poutputArray) {if (pinputArray == null || poutputArray == null || uik> uiInputnum || uiinputnum <= 0 || uik <= 0) {return false;} int start = 0; int end = uiinputnum-1; inter index = pin false; while (index! = uik-1) {if (index> uik-1) {// index berada di sisi kanan k-1 end = index-1; index = partition (pICputArray, start, end);} else {start = index+1; index = partition (pICputArray, start, end);} for (int (int int (int = i = 0; i <uik; i ++) {poutputArray [i] = pinputArray [i];} return true;} // Fungsi partisi partisi mengembalikan nilai indeks dari baris cepat elemen pertama array indeks public static partition (int [] a, int start, int end) {int privot = a start]; start]; int i, int a, int start, int end) {int privot = a [start] [start]; j = end; while (i <j) {while (i <j && privot <= a [j]) {j-;} swap (a, i, j); while (i <j && privot> = a [i]) {i ++;} swap (a, i, j);} return i;} public static void swap (int [] a, int i, int j) {int t = a [i]; a [i] = a [j]; a [j] = t;}} 2. Angka dengan lebih dari setengah kejadian di array
Ada angka dalam array yang muncul lebih dari setengah panjang array. Temukan nomor ini. Misalnya, 1, 2, 3, 2, 2, 5, 4, 2, angka 2 muncul 5 kali dalam array, melebihi setengah dari panjang array, output 2
Terinspirasi oleh jenis cepat, dalam jenis cepat, sekarang pilih angka dalam array, dan kemudian sesuaikan urutan angka dalam array sehingga angka yang lebih kecil dari angka yang dipilih berada di peringkat kiri dan angka yang lebih besar dari angka yang dipilih berada di peringkat di sebelah kanannya.
Jika subskrip dari nomor yang dipilih kebetulan adalah N/2, maka nomor ini adalah nomor median dalam array
Impor java.util.scanner; kelas publik utama {public static void main (string [] args) {pemindai in = pemindai baru (system.in); int n = in.nextInt (); int [] num = int [n]; untuk (int i = 0; i <n; i ++) {num] = in.nextor b = getHalfnum (n, num); if (b! = -1) {System.out.println (b);}} public int static gethalfnum (int uiInputnum, int [] cipputArray) {if (pinputArray == null || uiinputnum <= 0) {if pinputArray == null || uiinputnum <= 0) {if pinputArray == null || uiIinputnum <= 0) {if pinputArray == null || uiinputnum <= 0) {if pinputArray == null || uiinputnum <= 0) {if pinputArray = start = 0; int end = uiInputNum-1; int index = partisi (pinputArray, start, end); while(index!=middle){//If it is not equal to half of length, it means that the median is not found if(index>middle){end=index-1;index=partition(pInputArray,start,end);} else{start=index+1;index=partition(pInputArray,start,end);}} return pInputArray[index];//index=middle}public static int partition(int[] a,int mulai, int end) {int privot = a [start]; int i = start; int j = end; while (i <j) {while (i <j && privot <= a [j]) {j-;} swap (a, i, j); while (i <j & privot> = a [i]) {i ++;} swap (a, i, j);} return i;} public static void swap (int [] a, int i, int j) {int t = a [i]; a [i] = a [j]; a [j] = t;}} 3. Temukan angka terkecil ke kusut di array
Misalnya, diberikan array 1, 5, 2, 6, 8, 0, 6, angka terkecil ke -4 adalah 5
Impor java.util.scanner; kelas publik utama {public static void main (string [] args) {pemindai in = pemindai baru (system.in); int n = in.nextInt (); int k = in.nextInt (); int [] num = int [n]; // int [] out = int [k] baru; untuk (int i = 0; i <n; i ++) {num [i] = in.nextInt ();} int b = getmink (n, num, k); if (b! =-1) {System.out.println (b);}} public static int getmink (int uiinputnum, int [] pinputArtR PublicArtR PublicArt (int [] pinputArtR PublicArtR (int [] pincutArtR publicArtR (int [] publicArt (] publicArtR (] publputarr (int [] publicarr ( uik) {if (pinputArray == null || uik> uiinputnum || uiinputnum <= 0 || uik <= 0) {return -1;} int start = 0; int end = uiInputnum -1; int index = partisi (pinputArray, start, end); while (index! = uik-1) {// if index bukan posisi k-1 if (index> uik-1) {end = index-1; index = partisi (pinputArray, start, end);} else {start = index+1; index = piCputArray, start, end);} {start pinPutArray [index] (pinputArray, end);}} return pinputArray [index]; end) {int privot = a [start]; int i = start; int j = end; while (i <j) {while (i <j && privot <= a [j]) {j-;} swap (a, i, j); while (i <j & privot> = a [i]) {i ++;} swap (a, i, j);} return i;} public static void swap (int [] a, int i, int j) {int t = a [i]; a [i] = a [j]; a [j] = t;}}Meringkaskan
Di atas adalah seluruh konten artikel ini tentang contoh kode tiga pertanyaan algoritma berdasarkan pemrograman Java yang cepat. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!