Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива - 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.