Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива - 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;
}
Собственно, ошибки: error 2100: illegal indirection; и IntelliSense: operand of * must be a pointer; Помогите, не понимаю почему ругается компилятор, установлен Visual Studio 2010. Другая задачка с указателями удачно отработала.

Решение задачи: «Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива»

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;
}

Объяснение кода листинга программы

  1. Создание функции sheiker_sort для сортировки массива с использованием указателей на правую и левую границы отсортированного массива.
  2. Создание указателя на левый крайний элемент в массиве и крайний правый элемент.
  3. Создание указателя на следующий по индексу элемент рассматриваемого элемента.
  4. Создание переменной flag для отслеживания перестановок в ряду.
  5. Создание переменной temp для временного хранения значения.
  6. Внешний цикл while, который выполняется пока указатель left меньше указателя right и были перестановки в ряде.
  7. Внутренний цикл for для сравнения значений элементов и выполнения перестановок при необходимости.
  8. Уменьшение значения right на единицу для изменения адреса крайнего правого элемента в ряду.
  9. Внутренний цикл for для движения по ряду в обратном направлении и выполнения перестановок при необходимости.
  10. Увеличение значения left на единицу для перехода к следующему элементу в ряду.
  11. Возврат указателя на отсортированный массив.
  12. Создание массива a и инициализация его значениями.
  13. Создание указателя rezult для хранения адреса отсортированного массива.
  14. Вызов функции sheiker_sort для сортировки массива a с указанием его размера.
  15. Запись адреса отсортированного массива в указатель rezult.
  16. Внутренний цикл for для распечатки каждого элемента упорядоченного массива.
  17. Вывод символа новой строки.
  18. Удаление указателя rezult.
  19. Вызов функции system для приостановки выполнения программы до нажатия клавиши.
  20. Возврат значения из функции main.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы