Rumah >Java >JavaSoalan temu bual >Temu bual Meituan: Sila tulis jadual cepat dengan tangan, saya terkejut!
Hari ini, penemu duga meminta saya menulis ringkasan di tempat kejadian adalah seperti berikut:
Pewawancara: Mari kita teruskan bercakap tentang struktur data dan algoritma. (Sambil bercakap, dia membelek resume saya dan menghulurkan pen, bermakna dia meminta saya menulis di belakang resume saya)
Rookie me: Apa maksud awak? Tulis di sini? (Sambil menunjuk resume)
Penemuduga: Yeah
Rookie me: No
Interviewer: Okay, itu sahaja untuk temuduga hari ini
Rookie me: (Saya sangat marah, saya nak letak pada pengurusan buruh saya. resume Penulisan kod? ) Shadiao
Penemuduga: (Memandang ke belakang, keliru)
Fikirkan, saya masih terlalu muda, tidak akan jadi seperti ini sekarang. Tulis sahaja, ia hanya sekeping kertas.
Sebenarnya, walaupun beratur cepat adalah mudah, saya rasa ramai orang tidak boleh menulisnya dengan tangan Adakah ramai orang yang boleh menulisnya dengan tangan di tempat dalam beberapa cara. .
Sekarang, mari analisa dan analisa ---- susun pantas.
Latar BelakangIsih cepat telah dicadangkan oleh C. A. R. Hoare pada tahun 1962. Idea asasnya adalah untuk membahagikan data untuk diisih kepada dua bahagian bebas melalui satu pengisihan Semua data dalam satu bahagian adalah lebih kecil daripada semua data di bahagian lain, dan kemudian menggunakan kaedah ini untuk memisahkan dua bahagian data dengan cepat. . Isih, keseluruhan proses pengisihan boleh dilakukan [secara rekursif], supaya keseluruhan data menjadi urutan tersusun.
Agak sukar untuk memahami konsep ini.
Ia boleh difahami seperti ini:
Isih cepat ialah versi jenis gelembung yang dipertingkatkan Keseluruhan prosesnya adalah untuk mengalih keluar dan menampal sesuatu, mengoyakkannya dan menampalnya, mengoyakkannya dan menampalnya, sehingga. semua elemen mencapai keadaan tertib.
Idea teras:
Mula-mula ambil nombor daripada jujukan sebagai nombor asas, dan kemudian lakukan pembahagian saiz
Dalam proses pembahagian, semua nombor yang lebih besar daripada nombor ini diletakkan di sebelah kanannya, dan nombor yang lebih kecil daripada; atau sama dengannya adalah Letakkan semuanya ke kiri;
Ulang langkah kedua untuk selang kiri dan kanan sehingga hanya terdapat satu nombor dalam setiap selang, dan pengisihan selesai.
Mari kita bongkar langkah demi langkah melalui gambar dan teks.
Ambil [4,1,6,2,9,3]
susunan ini sebagai contoh.
Hantaran pertama:
Tertib tatasusunan semasa ialah [3, 1, 2, 4, 9, 6].
Langkah seterusnya:
2.
import java.util.Arrays; public class QuickSortDemo { //四个步骤: //1.比较startIndex和endIndex,更喜欢理解为校验 //2.找出基准 //3.左边部分排序 //4.右边排序 public static void quickSort(int[] arr, int startIndex, int endIndex) { if (startIndex < endIndex) { //找出基准 int partition = partition(arr, startIndex, endIndex); //分成两边递归进行 quickSort(arr, startIndex, partition - 1); quickSort(arr, partition + 1, endIndex); } } //找基准 private static int partition(int[] arr, int startIndex, int endIndex) { int pivot = arr[startIndex]; int left = startIndex; int right = endIndex; //等于就没有必要排序 while (left != right) { while (left < right && arr[right] > pivot) { right--; } while (left < right && arr[left] <= pivot) { left++; } //找到left比基准大,right比基准小,进行交换 if (left < right) { swap(arr, left, right); } } //第一轮完成,让left和right重合的位置和基准交换,返回基准的位置 swap(arr, startIndex, left); return left; } //两数交换 public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] a = {3, 1, 2, 4, 9, 6}; quickSort(a, 0, a.length - 1); //输出结果 System.out.println(Arrays.toString(a)); } }Hasil keluaran:
[1, 2, 3, 4, 6, 9]
Atas ialah kandungan terperinci Temu bual Meituan: Sila tulis jadual cepat dengan tangan, saya terkejut!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!