Быстрая сортировка - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д