Лабораторная работа по программированию: Быстрая сортировка - C (СИ)
Формулировка задачи:
Сделать быструю сортировку
Ребят, очень надо, помогите плиз, буду очень признателен
Решение задачи: «Лабораторная работа по программированию: Быстрая сортировка»
textual
Листинг программы
// quickSort.c
#include <stdio.h>
void quickSort(int[], int, int);
int partition(int[], int, int);
int main() {
int a[] = { 7, 12, 1, -2, 0, 15, 4, 11, 9};
int i;
printf("\n\nUnsorted array is: ");
for (i = 0; i < 9; ++i) {
printf(" %d ", a[i]);
}
quickSort(a, 0, 8);
printf("\n\nSorted array is: ");
for (i = 0; i < 9; ++i) {
printf(" %d ", a[i]);
}
return 0;
}
void quickSort(int a[], int l, int r) {
int j;
if (l < r) {
// divide and conquer
j = partition(a, l, r);
quickSort(a, l, j - 1);
quickSort(a, j + 1, r);
}
}
int partition(int a[], int l, int r) {
int pivot, i, j, t;
pivot = a[l];
i = l;
j = r + 1;
while (1) {
do {
++i;
} while (a[i] <= pivot && i <= r);
do {
--j;
} while (a[j] > pivot);
if (i >= j) {
break;
}
t = a[i];
a[i] = a[j];
a[j] = t;
}
t = a[l];
a[l] = a[j];
a[j] = t;
return j;
}
Объяснение кода листинга программы
- Включаем заголовочный файл stdio.h для использования функций ввода-вывода
- Объявляем две функции: quickSort и partition
- Функция quickSort принимает массив, левую границу и правую границу в качестве параметров
- Если левая граница меньше правой границы, то рекурсивно вызываем функцию quickSort для левой и правой половин массива после разделения на подмассивы в функции partition
- Функция partition принимает массив, левую границу, правую границу и опорный элемент в качестве параметров
- Выбираем опорный элемент как первый элемент массива
- Инициализируем переменные i и j для указания на начало и конец подмассива, содержащего элементы, меньшие или равные опорному элементу
- Пока встреча с элементом, большим опорного элемента, не произошла, увеличиваем значение i
- Пока встреча с элементом, меньшим или равным опорному элементу, не произошла, уменьшаем значение j
- Если i стало больше j, значит, опорный элемент находится в самом конце массива и является уже последним элементом
- Если i меньше или равно j, меняем местами элементы с индексами i и j
- Перемещаем опорный элемент на позицию j
- Возвращаем j в качестве индекса для разделения массива на подмассивы
- В функции main создаем массив a и инициализируем его значениями
- Выводим массив на экран
- Рекурсивно вызываем функцию quickSort для массива a с левым индексом 0 и правым индексом 8
- Выводим отсортированный массив на экран
- Возвращаем 0 в качестве статуса выполнения программы