Проблемы с указателями: алгоритмы сортировки в C - PullRequest
0 голосов
/ 06 апреля 2020

Я приехал с python и пытаюсь выучить C, но я только вчера начал с этого указателя. Я написал перевернутый алгоритм сортировки, который должен принимать несортированный массив, затем на каждом проходе выбирать самый высокий и самый низкий элементы, помещать их в каждый конец, а затем рекурсивно делать то же самое, игнорируя уже отсортированные элементы. Проблема в том, что я всегда получаю некоторые ошибки (разные ошибки в зависимости от того, что я пытаюсь изменить), которые я не могу исправить в отношении типов указателей. Ребята, вы можете помочь?


#include <stdio.h>


void inv_cocksort(int *arr[], int first, int last);

int main(void)
{
    int unsorted[11] = {3, 1, 4, 5, 4, 2, 6, 9, 2, 8, 7};
    int unsorted_length = 11;

    for (int i = 0; i < unsorted_length; i++)
    {
        printf("%i", unsorted[i]);
    }

    inv_cocksort(&unsorted, 0, unsorted_length-1);

    for (int i = 0; i < unsorted_length; i++)
    {
        printf("%i", unsorted[i]);
    }


    void inv_cocksort(int *arr[], int first, int last)
    {
        if (first > last)
        {
            return;
        }
        else
        {
            for (int i = 0; i < last-1; i++)
            {
                if (arr[i] < arr[last])
                {
                    int temp = *arr[last];
                    *arr[i] = *arr[last];
                    *arr[last] = temp;
                }
                if (arr[i] > arr[first])
                {
                    int temp2 = *arr[first];
                    *arr[i] = *arr[first];
                    *arr[last] = temp2;
                }
            }
            inv_cocksort(&arr[], first+1, last-1)
        }

}

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Есть много проблем:

Вы хотите это:

#include <stdio.h>


void inv_cocksort(int arr[], int first, int last)
{
  if (first > last)
  {
    return;
  }
  else
  {
    for (int i = 0; i < last - 1; i++)
    {
      if (arr[i] < arr[last])
      {
        int temp = arr[last];
        arr[i] = arr[last];
        arr[last] = temp;
      }
      if (arr[i] > arr[first])
      {
        int temp2 = arr[first];
        arr[i] = arr[first];
        arr[last] = temp2;
      }
    }
    inv_cocksort(arr, first + 1, last - 1);
  }
}

int main(void)
{
  int unsorted[11] = { 3, 1, 4, 5, 4, 2, 6, 9, 2, 8, 7 };
  int unsorted_length = 11;

  for (int i = 0; i < unsorted_length; i++)
  {
    printf("%i ", unsorted[i]);
  }

  inv_cocksort(unsorted, 0, unsorted_length - 1);

  for (int i = 0; i < unsorted_length; i++)
  {
    printf("%i ", unsorted[i]);
  }
}

Это компилируется по крайней мере без предупреждений, но не работает правильно.

1 голос
/ 06 апреля 2020

Я думаю, вам нужно изменить

for (int i = 0; i < last-1; i++)

на

for (int i = first+1; i < last-1; i++)

или аналогичный.

0 голосов
/ 06 апреля 2020

Исправлено.

Сначала я добавил целую кучу запусков и & s, потому что боялся, что функция получит только копию переданных значений, закажет эту копию и потеряет ее, как только стек память больше не была выделена для него. Оказывается, имена массивов на самом деле работают как указатели на первое значение, даже если массивы не являются строками, поэтому мне вообще не приходилось манипулировать какой-либо памятью.

Исправлены также логики c, я Прошу прощения за загрузку такого глючного кода вначале.

И, конечно, потому что это шейкер, не совсем, но может быть? idk.


#include <stdio.h>


void inv_cocksort(int arr[], int first, int last);

int main(void)
{
    int unsorted[11] = {3, 1, 4, 5, 4, 2, 6, 9, 2, 8, 7};
    int unsorted_length = 11;

    for (int i = 0; i < unsorted_length; i++)
    {
        printf("%i", unsorted[i]);
    }
    printf("\n");

    inv_cocksort(unsorted, 0, unsorted_length-1);

    for (int j = 0; j < unsorted_length; j++)
    {
        printf("%i", unsorted[j]);
    }
}


    void inv_cocksort(int arr[], int first, int last)
    {
        if (first > last)
        {
            return;
        }
        else
        {
            for (int i = first; i <= last; i++)
            {
                if (arr[i] < arr[last])
                {
                    int temp = arr[last];
                    arr[last] = arr[i];
                    arr[i] = temp;
                }
                if (arr[i] > arr[first])
                {
                    int temp2 = arr[first];
                    arr[first] = arr[i];
                    arr[i] = temp2;
                }
            }
            inv_cocksort(arr, first+1, last-1);
        }
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...