【问题标题】:Problems with pointers: sorting algorithms in C指针问题:C 中的排序算法
【发布时间】:2020-04-06 05:34:38
【问题描述】:

我来自 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)
        }

}

【问题讨论】:

  • 当你做什么的时候你会得到哪个错误?
  • 我觉得你需要把for (int i = 0; i &lt; last-1; i++)改成for (int i = first; i &lt; last-1; i++)或者类似的
  • 我改变了定义函数的方式;我尝试将第一个参数定义为 int *unsorted[] 以告诉它接受和寻址并将 &unsorted 传递给它。我收到诸如无效指针类型之类的错误,并且在没有强制转换的情况下将 int 更改为指针。无法让它工作。

标签: c sorting pointers


【解决方案1】:

我认为你需要改变

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

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

或类似的。

【讨论】:

  • 是什么让你这么认为?
【解决方案2】:

有很多问题:

你想要这个:

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

这至少编译没有警告,但它不能正常工作。

【讨论】:

  • 我可以稍后修复逻辑,真的,只需要首先让它编译
【解决方案3】:

修复它。

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

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

而 cocksort 是因为它是鸡尾酒调酒器,不完全是,但也许?身份证。


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

【讨论】:

  • 如果您达到目标,请接受答案。顺便说一句,我不会将其命名为“cocksort” - 如果您想缩写“cocktail Shaker”,那么将其命名为“cockt_sort”。 ;-)
  • Lui Martinez Laskowski,感谢您在 StackOverflow 上回答您自己的问题。但是在存在多个赞成答案的情况下,如果您解释与现有答案的核心差异,它将提高您的答案的有用性。这也可以避免您不知道将赞成和接受作为向回答者反馈的一种方式的印象。看看stackoverflow.com/help/someone-answers
  • 感谢您的反馈。我确实赞成答案,我没有接受任何特定的答案,因为它们都不是我想要的,这进一步阐明了指针和内存地址在 C 中如何在数组上下文中工作并被称为函数参数.
猜你喜欢
  • 2019-07-31
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多