Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива - C (СИ)
Формулировка задачи:
Листинг программы
- //Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива и сравнения указателей.
- #include <stdio.h>
- void sort_sheker(int n, int* p)
- {
- int left = 0;
- int right = n;
- int t; // переменная для перестановки
- int flag = 1; // флаг наличия перемещений
- while( ( p[left] < p[right] ) && (flag > 0) ) //сравниваю адреса указателей на левый и правый элемент массива и на факт перемещение
- {
- flag = 0;
- for (int i = left; i < right; i++)
- { //двигаемся слева направо
- if ( *p[i] > *p[i+1])
- {
- t = *p[i];
- *p[i] = *p[i+1];
- *p[i+1]=t;
- flag = 1;
- }
- }
- right--;
- for(int i = right; i > left; i--)
- { //двигаемся справа налево
- if ( *p[i-1] > *p[i])
- {
- t = *p[i];
- *p[i] = *p[i-1];
- *p[i-1] = t;
- flag = 1;
- }
- }
- left++;
- }
- return;
- }
- int main() {
- int m[6];
- int i;
- for(i = 0; i < 6; i++)
- {
- printf("m[%d]=",i);
- scanf("%d", &m[i]);
- }
- sort_sheker(6, m);
- for(i = 0; i < 6; i++)
- printf("%d ", m[i]);
- getchar();
- getchar();
- return 0;
- }
Решение задачи: «Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива»
textual
Листинг программы
- //----------------------------------------------------------------------------------------------------------------------------------------------
- //Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива и сравнения указателей.
- #include "stdio.h"
- #include <iostream>
- //#pragma warning(disable: 4996) вместо #define _CRT_SECURE_NO_WARNINGS
- int *sheiker_sort(int *p, int n) //функция должна вернуть за один вызов один элемент массива
- {
- //нужно создать указатель на левый крайний элемент в массиве и крайний правый элемент
- int *left = new int;
- left = p;
- int *right = new int;
- right = &p[n-1];
- int *next = new int; //переменная содержит адрес следующего по индексу рассматриваемого элемента
- int flag = 0; // Значение 1 свидиетельствует о неупорядоченности ряда
- int temp;
- while( left < right && flag > 0 )//пока адрес левого указателя меньше адреса правого указателя и были перестановки в ряде
- {
- flag = 0;
- for ( p = left; p <= right; p++) //!на последнем шаге итерации указатель р будет содержать адрес последнего элемента в ряду
- {
- next = p+1;
- if ( *p > *next) //сравниваем значения
- {
- //поменять местами значения указетелей next и p
- temp = *p;
- *p = *next;
- *next = temp;
- flag = 1; //перестановка элементов состоялась
- }
- }
- right--; //изменим адрес крайнего правого элемента в ряду
- //двигаемся по ряду в обратном направлении
- for ( p = right; p > left; p--)
- {
- next = p-1; //содержит адрес следующего рассматриваемого элемента
- if (*next > *p)
- {
- temp = *p;
- *p = *next;
- *next = temp;
- flag = 1; //перестановка была в ряду
- }
- }
- left++;
- }
- return p;
- }
- void main()
- {
- using namespace std;
- setlocale(LC_ALL, "Russian");
- int a[4]={8,6,4,2};
- int *rezult = new int; //указатель на отсоритрованный массив
- int i;
- rezult = sheiker_sort(a, 4); //адрес массива запишем в переменную типа указатель
- for (i = 0; i < 4; i++)
- printf("%d ",rezult[i]); //распечатываем каждый элемент упорядоченного массива
- printf("\n");
- delete rezult;
- system("pause");
- return;
- }
Объяснение кода листинга программы
- Создание функции sheiker_sort для сортировки массива с использованием указателей на правую и левую границы отсортированного массива.
- Создание указателя на левый крайний элемент в массиве и крайний правый элемент.
- Создание указателя на следующий по индексу элемент рассматриваемого элемента.
- Создание переменной flag для отслеживания перестановок в ряду.
- Создание переменной temp для временного хранения значения.
- Внешний цикл while, который выполняется пока указатель left меньше указателя right и были перестановки в ряде.
- Внутренний цикл for для сравнения значений элементов и выполнения перестановок при необходимости.
- Уменьшение значения right на единицу для изменения адреса крайнего правого элемента в ряду.
- Внутренний цикл for для движения по ряду в обратном направлении и выполнения перестановок при необходимости.
- Увеличение значения left на единицу для перехода к следующему элементу в ряду.
- Возврат указателя на отсортированный массив.
- Создание массива a и инициализация его значениями.
- Создание указателя rezult для хранения адреса отсортированного массива.
- Вызов функции sheiker_sort для сортировки массива a с указанием его размера.
- Запись адреса отсортированного массива в указатель rezult.
- Внутренний цикл for для распечатки каждого элемента упорядоченного массива.
- Вывод символа новой строки.
- Удаление указателя rezult.
- Вызов функции system для приостановки выполнения программы до нажатия клавиши.
- Возврат значения из функции main.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д