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