Концепция быстрой сортировки алгоритма
Быстрая сортировка обычно основана на рекурсивной реализации. Идея заключается в следующем:
1. Выберите подходящее значение (идеальное значение является лучшим, но первое значение в массиве обычно используется в реализации), которое называется «Pivot».
2. На основании этого значения разделите массив на две части: меньшая часть слева и большая часть справа.
3. Уверено, что после такого раунда позиция этого стержня должна быть в окончательной позиции.
4. Повторите приведенный выше процесс для двух субрайей, пока не появится только один элемент на массив.
5. Сортировка завершена.
Базовый метод реализации:
public static void Quicksort (int [] arr) {qsort (arr, 0, arr.length-1);} частная статическая void qsort (int [] arr, int low, int high) {if (low <высокий) {int pivot = partition (arr, low, высокий); // Разделите массив на две части QSORT (ARR, LOW, PIVOT-1); // Сортировать левый subarray QSORT (arr, pivot+1, High); // Сортировка правого субаррея рекурсивно}} Частный статический раздел int (int [] arr, int low, int high) {int pivot = arr [low]; // pivot записывает while (low <high) {while (low <high && arr [high]> = pivot) -high; arr [low] = arr [High]; // обмен записывает записи меньше, чем pivot влево, в то время как (low <High && arr [low] <= pivot) ++ low; arr [High] = arr [low]; // обмен записываемыми записями меньше, чем олова на правый конец} // Сканирование завершено, а поворот на месте arr [low] = pivot; // возвращать положение поворота к возврату низко;}Используйте дженерики для реализации алгоритма быстрого порядка
Ниже приведен класс QuickSort, который содержит статическую функцию Sort (), который может сортировать массивы любого типа. Если это массив типов объектов, тип объекта должен реализовать сопоставимый интерфейс, чтобы для сравнения можно было использовать функцию сравнения.
Был использован основной алгоритм сортировки быстрого ряда, и не было выполнено обработка оптимизации.
Исходный код заключается в следующем:
Импорт java.util.linkedlist; import java.util.list; import java.util.listiterator; импорт java.util.random; Public Class QuickSort {@SuppressWarnings ("unchecked") // Модифицировать вышеуказанный прототип функции быстрого ряда, чтобы он мог сортировать массивы любого типа объекта. Эта функция используется внутри, а интерфейс внешней функции сортировки сортирует (). Функция сортировки требует, чтобы объект должен реализовать сопоставимый интерфейс, который может обеспечить обнаружение типа времени компиляции, см. Следующую статью. private static void Quicksort (Object [] in, int begin, int end) {if (begin == end || begin == (end-1)) return; Объект p = в [начало]; int a = begin +1; int b = a; for (; b <end; b ++) {// Этот массив типа объекта должен реализовать сопоставимый интерфейс, чтобы вы могли использовать функцию сравнения для сравнения if (((сопоставимый <объект>) в [b]). compareto (p) <0) {if (a == b) {a ++; Продолжить;} объект temp = в [a]; в [a] = в [b]; в [b] = temp; a ++; }} в [begin] = в [a-1]; в [a-1] = p; if (a-1> begin) {Quicksort (in, begin, a); } if (end-1> a) {QuickSort (in, a, end); } возвращаться; } // Использование Generics Для сортировки какого -либо массива объектов массив типа объекта должен реализовать сопоставимый интерфейс Public Static <T Extens сопоставимо <? Super t >> void sort (t [] input) {QuickSort (input, 0, input.length); } // Добавить функцию сортировки объектов списка, см. Функцию SORT () класса java.util.collections в Java Public Static <T Extens сопоставимо <? Super t >> void sort (list <t> list) {object [] t = list.toarray (); // конвертировать список в массив QuickSort (t, 0, t.length); // Сортировка массива // После завершения сортировки массива напишите в список ListIterator <t> i = list.listiterator (); for (int j = 0; j <t.length; j ++) {i.next (); I.Set ((T) T [J]); }} // Поскольку дженерики нельзя использовать в Java, примитивные типы данных (Int, Double, байт и т. Д.), Вы можете использовать только механизм перегрузки функции для сортировки этих примитивных массивов (int [], Double [], Byte [] и т. Д.). Чтобы поделиться той же функцией сортировки, механизм исходного типа (автобоксинг, распаковка) используется для инкапсуляции его в соответствующий тип объекта, образуйте новую массив объектов, сортируйте и затем декапсуляция. Недостатком этого является то, что для сохранения инкапсулированного массива требуется дополнительные шаги преобразования и дополнительное пространство. Другой способ - скопировать код сортировки в каждую перегруженную функцию. Функция sort () в классе java.util.arrays в официальном API использует этот метод, который можно увидеть из исходного кода класса массивов. public static void sort (int [] input) {integer [] t = new Integer [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = input [i]; // encapsulation} QuickSort (t, 0, t.length); // Сортировка для (int i = 0; i <input.length; i ++) {input [i] = t [i]; // uncapsation} // uplud input) {double [] t = new Double [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = input [i]; } QuickSort (t, 0, t.length); for (int i = 0; i <input.length; i ++) {input [i] = t [i]; }} // Функция перегрузки байта [] массива общедоступной статической void sort (byte [] input) {byte [] t = new Byte [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = input [i]; } QuickSort (t, 0, t.length); for (int i = 0; i <input.length; i ++) {t [i] = input [i]; } QuickSort (t, 0, t.length); для (int i = 0; i <input.length); input.length; i ++) {input [i] = t [i]; }} // short [] Функция перегрузки public void sort (short [] input) {short [] t = new short [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = input [i]; } QuickSort (t, 0, t.length); for (int i = 0; i <input.length; i ++) {input [i] = t [i]; }} // short [] Функция перегрузки public void sort (char [] input) {символ [] t = новый символ [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = input [i]; } QuickSort (t, 0, t.length); for (int i = 0; i <input.length; i ++) {input [i] = t [i]; }} // Функция перегрузки Float [] Array public static void sort (float [] input) {float [] t = new float [input.length]; for (int i = 0; i <input.length; i ++) {t [i] = input [i]; } QuickSort (t, 0, t.length); for (int i = 0; i <input.length; i ++) {input [i] = t [i]; }} // Основная функция для тестирования общедоступной статической void main (string [] args) {// создавать массив int [], состоящий из случайных чисел для тестирования int len = 10; int [] input = new int [len]; Случайный r = new Random (); System.out.print ("int [] перед сортировкой:"); for (int i = 0; i <input.length; i ++) {input [i] = r.nextint (10*len); System.out.print (input [i] + ""); } System.out.println (); System.out.print ("int [] после сортировки:"); сортировка (вход); для (int i: input) {System.out.print (i + ""); } System.out.println (); // генерировать массив строк для тестирования строки [] s = new String [] {"b", "a", "e", "d", "f", "c"}; System.out.print ("string [] перед сортировкой:"); for (int i = 0; i <s.length; i ++) {System.out.print (s [i]+""); } System.out.println (); System.out.print ("string [] после сортировки:"); сортировки (ы); for (int i = 0; i <s.length; i ++) {System.out.print (s [i]+""); } System.out.println (); // Сгенерировать список строк для тестового списка <string> l = new LinkedList <String> (); s = new String [] {"b", "a", "e", "d", "f", "c"}; System.out.print ("LinkedList <string> перед сортировкой:"); for (int j = 0; j <s.length; j ++) {l.Add (s [j]); System.out.print (s [j] + ""); } System.out.println (); Сорт (L); System.out.print ("LinkedList <string> после сортировки:"); for (String ts: l) {System.out.print (ts + ""); } System.out.println (); }}Запустите основной функциональный тест, и с вывода вы можете видеть, что класс QuickSort работает нормально:
int [] Перед сортировкой: 65 48 92 26 3 8 59 21 16 45INT [] После сортировки: 3 8 16 21 26 45 48 59 65 92String [] Перед сортировкой: BaedFC String [] После сортировки: ABCDEF LinkedList <string> перед сортировкой: baedfc linkedlist <string> после сортировки: abcdef