Упорядочить массив по возрастанию методом быстрой сортировки - C (СИ)
Формулировка задачи:
Ввести длину массива и массив. Упорядочить массив по возрастанию
методом быстрой сортировки: Выбрать средний элемент массива и переставить
элементы так, чтобы слева оказались только меньшие, а справа -
только большие, чем средний. После этого рекурсивно применить этот метод
к левой и правой частям.
Решение задачи: «Упорядочить массив по возрастанию методом быстрой сортировки»
textual
Листинг программы
void quicksort(char **a, int first, int last, int (*p)(const char *, const char *))
{
int i = first, j = last;
char *x = a[(first + last) / 2];
char *k;
do
{
while (p(x, a[i])>0) i++;
while (p(a[j], x)>0) j--;
if (i <= j)
{
if (i < j)
{
k = a[i];
a[i] = a[j];
a[j] = k;
}
i++;
j--;
}
}
while (i <= j);
if (i < last) quicksort(a, i, last, p);
if (first < j) quicksort(a, first, j, p);
}
Объяснение кода листинга программы
В данном коде реализован алгоритм быстрой сортировки, он использует рекурсивный подход для сортировки массива по возрастанию.
- Входные параметры функции:
—
**a- указатель на массив элементов, который необходимо отсортировать —int first- индекс первого элемента в массиве —int last- индекс последнего элемента в массиве —int (*p)(const char *, const char *)- функция сравнения, которая определяет порядок элементов в массиве - Внутри функции создаются следующие переменные:
—
int i = first- индекс начального элемента —int j = last- индекс последнего элемента —char *x = a[(first + last) / 2]- средний элемент массива —char *k- временная переменная для обмена элементов - Далее, в цикле do-while выполняются следующие действия:
—
while (p(x, a[i])>0)- смещение указателяiвправо до тех пор, пока не будет найден элемент, который большеx—while (p(a[j], x)>0)- смещение указателяjвлево до тех пор, пока не будет найден элемент, который меньшеx—if (i <= j)- проверка, что указателиiиjне вышли за границы массива —if (i < j)- обмен элементовa[i]иa[j]с помощью временной переменнойk—i++;иj--;- смещение указателейiиjв соответствии с результатами обмена - После завершения цикла do-while, выполняются следующие действия:
—
if (i < last)- проверка, что указательiне вышел за границы массива —quicksort(a, i, last, p)- рекурсивный вызов функции для сортировки подмассива, начиная с элемента с индексомi—if (first < j)- проверка, что указательjне вышел за границы массива —quicksort(a, first, j, p)- рекурсивный вызов функции для сортировки подмассива, начиная с элемента с индексомfirstТаким образом, данный код реализует алгоритм быстрой сортировки, который обеспечивает стабильную сортировку массива по возрастанию.