Алгоритм быстрой сортировки (quicksort) — это один из наиболее эффективных и широко используемых алгоритмов сортировки. Он может быть адаптирован для сортировки как в порядке возрастания, так и в порядке убывания. Давайте рассмотрим, как работает алгоритм quicksort для сортировки массива в порядке убывания на языке программирования C.
Основные шаги алгоритма quicksort
Выбор опорного элемента: Обычно выбирается первый элемент массива, последний элемент или элемент, находящийся посередине. В нашем случае мы будем использовать последний элемент в качестве опорного.
Разбиение массива: Элементы массива будут разделены на две части: элементы больше опорного и элементы меньше или равные опорному. Мы будем помещать элементы больше опорного слева, а меньшие — справа.
Рекурсивная сортировка: После разбиения алгоритм рекурсивно применяется к двум подмассивам.
Реализация на языке Си
Вот пример кода для сортировки массива в порядке убывания с использованием quicksort:
#include <stdio.h>
// Функция для обмена двух элементов
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// Функция для разделения массива
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++; // Увеличиваем индекс большего элемента
swap(&arr[i], &arr[j]); // Обмен
}
}
swap(&arr[i + 1], &arr[high]); // Обмен опорного элемента
return (i + 1); // Возвращаем индекс опорного элемента
}
// Рекурсивная функция quicksort
void quicksort(int arr[], int low, int high) {
if (low < high) {
// Разделяем массив
int pi = partition(arr, low, high);
// Рекурсивно сортируем подмассивы
quicksort(arr, low, pi - 1);
quicksort(arr, pi + 1, high);
}
}
// Функция для вывода массива
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
// Основная функция
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Исходный массив: \n");
printArray(arr, n);
quicksort(arr, 0, n - 1);
printf("Отсортированный массив в порядке убывания: \n");
printArray(arr, n);
return 0;
}
Объяснение кода
- Функция
swap: Эта функция меняет местами два элемента массива. - Функция
partition: Она разделяет массив на две части вокруг опорного элемента, так что элементы больше опорного находятся слева, а меньшие — справа. - Функция
quicksort: Это рекурсивная функция, которая сортирует массив. Она вызывает саму себя для подмассивов, которые были созданы в процессе разбиения. - Функция
printArray: Эта вспомогательная функция выводит элементы массива на экран.
Заключение
Алгоритм quicksort имеет среднюю временную сложность O(n log n) и является эффективным для сортировки больших массивов. Теперь вы можете использовать этот алгоритм для сортировки в порядке убывания в своих проектах на языке C!