Введение

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

Ключевые понятия алгоритмов сортировки

Прежде чем углубляться в конкретные алгоритмы сортировки, важно понять некоторые основные понятия:

  • Сортировка на основе сравнения и сортировка без сравнения. Алгоритмы, основанные на сравнении, сравнивают элементы набора данных, чтобы определить их порядок, в то время как алгоритмы, не основанные на сравнении, используют другие методы, такие как подсчет или сортировка по основанию.
  • Стабильная и нестабильная сортировка: стабильный алгоритм сортировки поддерживает относительный порядок одинаковых элементов в отсортированном выводе, в то время как нестабильный алгоритм этого не гарантирует.
  • Сортировка на месте и сортировка вне места. Алгоритмы сортировки на месте сортируют данные в исходной ячейке памяти, требуя минимальной дополнительной памяти. Неуместные алгоритмы используют дополнительную память для выполнения сортировки.
  • Временная сложность и пространственная сложность: эти показатели показывают, как производительность алгоритма зависит от размера входных данных, помогая вам оценить его эффективность.

Популярные алгоритмы сортировки в Java

Давайте кратко рассмотрим некоторые популярные алгоритмы сортировки:

Пузырьковая сортировка

  • Простой алгоритм на основе сравнения, который многократно проходит по списку, сравнивает соседние элементы и меняет их местами, если они расположены в неправильном порядке. Этот процесс повторяется до тех пор, пока список не будет отсортирован.

Сортировка выбором

  • Другой алгоритм, основанный на сравнении, который работает, разделяя входные данные на отсортированную и несортированную области. Он многократно выбирает наименьший (или самый большой) элемент из несортированной области и перемещает его в конец отсортированной области.

Сортировка вставками

  • Этот основанный на сравнении алгоритм строит отсортированный вывод по одному элементу за раз. Это эффективно для небольших наборов данных или данных, которые уже частично отсортированы.

Сортировка слиянием

  • Алгоритм «разделяй и властвуй», который рекурсивно делит входные данные на две половины, сортирует каждую половину, а затем объединяет отсортированные половины для получения окончательного отсортированного вывода.

Быстрая сортировка

  • Другой алгоритм «разделяй и властвуй», который работает путем выбора «основного» элемента из списка и разделения других элементов на две группы в зависимости от того, меньше они или больше, чем опорный элемент. Затем подсписки сортируются рекурсивно.

Реализация алгоритмов сортировки в Java

Вот примеры кода Java для каждого алгоритма, а также краткое объяснение того, как они работают:

Пузырьковая сортировка:

public void bubbleSort(int[] arr) {
    int n = arr.length;
    boolean swapped;
    for (int i = 0; i < n - 1; i++) {
        swapped = false;
        for (int j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = true;
            }
        }
        if (!swapped) break;
    }
}

В пузырьковой сортировке соседние элементы сравниваются и меняются местами, если они расположены в неправильном порядке. Этот процесс повторяется до тех пор, пока перестановки не понадобятся, что указывает на то, что список отсортирован.

Сортировка выбора:

public void selectionSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        int temp = arr[minIndex];
        arr[minIndex] = arr[i];
        arr[i] = temp;
    }
}

В сортировке выбором алгоритм делит входные данные на отсортированную и несортированную области. Он неоднократно находит минимальный (или максимальный) элемент в несортированной области и перемещает его в конец отсортированной области, пока не будет отсортирован весь список.

Сортировка вставками:

public void insertionSort(int[] arr) {
    int n = arr.length;
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

Сортировка вставками работает путем построения отсортированного вывода по одному элементу за раз. Для каждого элемента алгоритм сравнивает его с элементами в отсортированной области, сдвигая их вправо, если они больше, чем текущий элемент, и вставляет элемент в правильное положение.

Сортировка слиянием:

public void mergeSort(int[] arr, int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}

public void merge(int[] arr, int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;

    int[] leftArray = new int[n1];
    int[] rightArray = new int[n2];

    for (int i = 0; i < n1; i++) {
        leftArray[i] = arr[left + i];
    }
    for (int i = 0; i < n2; i++) {
        rightArray[i] = arr[mid + 1 + i];
    }

    int i = 0, j = 0, k = left;
    while (i < n1 && j < n2) {
        if (leftArray[i] <= rightArray[j]) {
            arr[k++] = leftArray[i++];
        } else {
            arr[k++] = rightArray[j++];
        }
    }

    while (i < n1) {
        arr[k++] = leftArray[i++];
    }
    while (j < n2) {
        arr[k++] = rightArray[j++];
    }
}

Сортировка слиянием — это алгоритм «разделяй и властвуй», который рекурсивно делит входные данные на две половины, сортирует каждую половину, а затем объединяет отсортированные половины для получения окончательного отсортированного вывода. Функция «слияние» объединяет два отсортированных подмассива в один отсортированный массив.

Быстрая сортировка:

public void quickSort(int[] arr, int low, int high) {
    if (low < high) {
        int pivotIndex = partition(arr, low, high);
        quickSort(arr, low, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, high);
    }
}

public int partition(int[] arr, int low, int high) {
    int pivot = arr[high];
    int i = low - 1;
    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    int temp = arr[i + 1];
    arr[i + 1] = arr[high];
    arr[high] = temp;
    return i + 1;
}

Быстрая сортировка — это еще один алгоритм «разделяй и властвуй», который работает, выбирая «основной» элемент из списка и разбивая остальные элементы на две группы в зависимости от того, меньше они или больше, чем опорный элемент. Затем подсписки сортируются рекурсивно. Функция partition переупорядочивает массив и возвращает опорный индекс.

Выбор правильного алгоритма сортировки

При выборе алгоритма сортировки учитывайте следующие факторы:

  • Размер набора данных
  • Отсортированы ли данные уже частично
  • Важность стабильности или дополнительного использования памяти

Имейте в виду, что каждый алгоритм имеет свой лучший, средний и худший сценарии, которые влияют на производительность. Понимание этих сценариев поможет вам выбрать правильный алгоритм на основе проблемы и набора данных.

Заключение

Понимание алгоритмов сортировки в Java имеет решающее значение для любого программиста, поскольку помогает оптимизировать задачи обработки и обработки данных. Практикуя предоставленные примеры и изучая более сложные алгоритмы сортировки, вы создадите прочную основу в этой важной области компьютерных наук. Я призываю вас поделиться своим опытом работы с алгоритмами сортировки в комментариях ниже и присоединиться к беседе!

  1. GeeksforGeeks Алгоритмы сортировки в Java
  2. Алгоритмы сортировки — визуализация и сравнение

Понравилось читать? Еще не являетесь участником Medium? Вы можете поддержать мою работу напрямую, зарегистрировавшись по моей реферальной ссылке здесь. Это быстро, просто и не требует дополнительных затрат. Спасибо за вашу поддержку!