指针问题:C语言中的排序算法

时间:2020-04-06 05:34:38

标签: c sorting pointers

我来自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 个答案:

答案 0 :(得分:1)

我认为您需要更改

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

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

或类似的

答案 1 :(得分:1)

有很多问题:

您想要这个:

#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]);
  }
}

该编译至少在没有警告的情况下进行,但是无法正常工作。

答案 2 :(得分:0)

解决了。

我首先添加了一堆开始和&s,因为我担心该函数将只接收传递的值的副本,一旦堆栈内存不再分配给该副本,则该副本将丢失并丢失。事实证明,即使数组不是字符串,数组名称实际上也可以用作指向第一个值的指针,因此我根本不需要操纵任何内存。

还修正了逻辑,很抱歉一开始上传这样的错误代码。

cocksort是因为它是鸡尾酒搅拌器,不是,但是也许呢? 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);
        }
    }

相关问题