Быстрая сортировка - C (СИ) (148226)
Формулировка задачи:
Помогите, пожалуйста, исправить ошибку в сортировке
void sort5(int left, int right){
int i = left, j = right;
int piv = mass[(i + j) / 2]; // Опорным элементом для примера возьмём средний
while (i <= j)
{
while (mass[i] < piv)
i++;
while (mass[j] > piv)
j--;
if (i <= j)
Swap((mass+(i++)), (mass+(j--)));
}
if (left < j)
sort5(left, j);
if (right > i)
sort5(i, right);
}Решение задачи: «Быстрая сортировка»
textual
Листинг программы
#include<stdio.h>
void sort5(int left, int right);
void Swap(int *x,int *y);
int mass[10]={10, 6,3,8,4,7};
int main(void)
{
int i;
sort5(0,9);
for(i=0;i<10;i++)
printf("%d ",mass[i]);
return 0;
}
void sort5(int left, int right){
int i = left, j = right;
int piv = mass[(i + j) / 2]; // Опорным элементом для примера возьмём средний
while (i <= j)
{
while (mass[i] < piv)
i++;
while (mass[j] > piv)
j--;
if (i <= j)
Swap((mass+(i++)), (mass+(j--)));
}
if (left < j)
sort5(left, j);
if (right > i)
sort5(i, right);
}
void Swap(int *x,int *y)
{
int t;
t=*x; *x=*y; *y=t;
}
Объяснение кода листинга программы
- Включаем заголовочный файл
, чтобы иметь возможность работать с функциями ввода-вывода. - Объявляем две функции: sort5 и Swap.
- Создаём массив mass[10] и инициализируем его значениями от 10 до 4 (включительно).
- В функции main вызываем sort5, передавая ей в качестве аргументов 0 и 9 (индексы левой и правой границ сортируемого массива).
- В функции sort5 при помощи цикла for перебираем все элементы массива и выводим их на экран с помощью функции printf.
- В функции sort5 создаём переменные i и j, которые будут обозначать левую и правую границы подмассива, который необходимо отсортировать.
- Вычисляем средний элемент массива и сохраняем его в переменной piv.
- Пока i не больше j выполняем следующие действия:
- Пока элемент с индексом i меньше piv - увеличиваем i на 1.
- Пока элемент с индексом j больше piv - уменьшаем j на 1.
- Если i не больше j - меняем местами элементы с индексами i и j с помощью функции Swap.
- Если после цикла i больше j - значит опорный элемент был найден в левой половине массива, и мы должны рекурсивно вызвать sort5 для левой половины массива с новыми границами (i, j).
- Если после цикла i меньше j - значит опорный элемент был найден в правой половине массива, и мы должны рекурсивно вызвать sort5 для правой половины массива с новыми границами (i, j).
- В функции Swap меняем местами значения указателей x и y, передавая их в функцию как аргументы. Используем временную переменную t для сохранения значения x.