Метод быстрой сортировки в Java (Quick sort) | OTUS

Метод быстрой сортировки в Java (Quick sort)

Быстрая сортировка является одной из наиболее эффективных из существующих в Java. В её основе лежит рекурсивный алгоритм Quick sort. В среднем сортировка в Java выполняется за время O(n logn), причём точная скорость зависит от выбора опорного элемента.

Принято считать, что алгоритм быстрой сортировки Quick sort использует известную стратегию «разделяй и властвуй». Речь идёт о том, чтобы разбивать задачу на подзадачи до той поры, пока перед нами не будет элементарная единица. В нашем случае массив делится на несколько массивов, а каждый из них сортируется отдельно, а потом объединяется в один массив.

Как работает быстрая сортировка в Java

Пошаговое описание алгоритма сортировки: 1.Выбираем опорный элемент из массива. Как правило, это средний элемент. 2.Делим массив на 2 подмассива. Элементы, которые меньше опорного, и элементы, которые больше опорного. 3.Рекурсивно применяем сортировку к обоим подмассивам.

В результате массивы будут делиться до тех пор, пока не останется один элемент, который потом отсортируется. Для наглядности смотрим анимацию и картинки ниже: Quicksort_in_Java_example_fast-20219-48f452.gif

Анализ алгоритма быстрой сортировки

Исходный массив: 1.jpg-20219-c46f39.png Выбираем опорный компонет, берём 3: 2.jpg-20219-72edab.png Теперь разобьём массив на подмассивы: те, что больше трёх и те, что меньше: 3.jpg-20219-1adaa3.png То же сделаем с левым подмассивом: 4.jpg-20219-8232b9.png Выбираем опорный элемент: 5.jpg-20219-98d089.png Разбиваем на подмассивы: 6.jpg-20219-cd9859.png Выбираем опорный компонент и выполняем разбиение на подмассивы. Проделываем это, пока в подмассиве не останется один элемент. 7.jpg-20219-233490.png Левая часть отсортирована. То же делается и для правой части, начиная от опорного элемента 3.

Что же, осталось реализовать java-код.

import java.util.Arrays;

    public class QuickSort {

        public static void quickSort(int[] array, int low, inthigh) {
            if (array.length == 0)
                return;//завершить выполнение, если длина массива равна 0

            if (low >= high)
                return;//завершить выполнение если уже нечего делить

            // выбрать опорный элемент
            int middle = low + (high - low) / 2;
            int opora = array[middle];

            // разделить на подмассивы, который больше и меньше опорного элемента
            int i = low, j = high;
            while (i <= j) {
                while (array[i] < opora) {
                    i++;
                }

                while (array[j] > opora) {
                    j--;
                }

                if (i <= j) {//меняем местами
                    int temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                    i++;
                    j--;
                }
        }

        // вызов рекурсии для сортировки левой и правой части
            if (low < j)
            quickSort(array, low, j);

        if (high > i)
                quickSort(array, i, high);
        }
        public static void main(String[] args) {
            int[] x = { 8, 0, 4, 7, 3, 7, 10, 12, -3 };
            System.out.println("Было");
            System.out.println(Arrays.toString(x));

            int low = 0;
            int high = x.length - 1;

       quickSort(x, low, high);
            System.out.println("Стало");
        System.out.println(Arrays.toString(x));
    }
    }

Мы рассмотрели алгоритм, благодаря которому реализуется быстрая сортировка в Java. В заключение скажем, что Quick sort — это действительно эффективный способ, идеально подходящий даже для сортировки больших массивов.

Хотите узнать о Java-программировании больше? Записывайтесь на наш курс «Разработчик Java»!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
2 комментария
2

int opora - довольно профессиональный подход

0

.

Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто