【问题标题】:Sort function, helpers.c, only listing a few numbers排序函数,helpers.c,只列出几个数字
【发布时间】:2015-12-29 00:58:35
【问题描述】:

我的排序功能似乎只重复列出一千个数字中的 3 个。不知道为什么。有什么想法吗?

我的排序数组从这里开始。我创建了一个遍历 n 个数字的 for 循环。然后我比较这些值并创建一个交换算法。我假设我的交换算法有缺陷。

/**
 * Sorts array of n values.
 */
void sort(int values[], int n)
{        
    //TODO: implement an O(n^2) sorting algorithm
    for (int i = 0; i < n - 1; i++)
    {
        if (values[i] < values[i + 1])
        {         
          int holder = values[i];
          values[i] = holder;
          values[i + 1] = values[i];
          values[i] = holder;
          printf("%i\n", values[i]);                
        }       
    }       
    return;        
}

【问题讨论】:

  • 你不给很多人发values[i] = holder;吗?如果您学会使用调试器以及如何逐行执行代码,那么这样的问题真的很容易找到。无论如何,学习如何使用调试器可能是个好主意,因为您的 sort 函数不会对数组进行完全排序。
  • 顺便说一句,如果您在排序时遇到问题,为什么要向我们展示不相关的search 函数?您可能想read about how to ask good questions,并学习如何创建Minimal, Complete, and Verifiable Example

标签: c sorting


【解决方案1】:

以下几行存在逻辑错误:

    int holder = values[i];
    values[i] = holder;
    values[i + 1] = values[i];
    values[i] = holder;

我假设您想交换 values[i]values[i+1] 的值。

您没有在该代码中的任何位置提取 values[i+1] 的值以将其分配给 values[i]

你需要使用:

    int holder = values[i];
    values[i] = values[i + 1];
    values[i + 1] = holder;

【讨论】:

  • 感谢您的帮助。不过,我似乎仍然得到一个未排序的数字列表。
  • 那是因为你的排序算法不完整。可以在维基百科中查找各种排序算法,实现最简单的排序算法——bubble sort
  • 如果您有大型数组要排序,冒泡排序是最不高效的排序算法之一。获取 quicksort 算法的副本,该算法在更大的数组上可以数量级更快。
【解决方案2】:

发生这种情况是因为您没有正确实施冒泡排序。像下面那样做-

/**
 * Sorts array of n values.
 */
void sort(int values[], int n)
{        
    //TODO: implement an O(n^2) sorting algorithm
    for (int i = 0; i < n - 1; i++)
    {
        for(int j=0;j<n-i-1;j++)
        {
        if (values[j+1] < values[j])
        {         
          int holder = values[j];
          values[j] = values[j + 1] 
          values[j + 1] = holder;

          printf("%i\n", values[j]);                
        }   
        }     
    }       
    return;        
}

在您的算法中,您只遍历了一次数组(因为只有一个 for 循环),而要使排序正常工作,您需要有两个嵌套循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2017-01-18
    相关资源
    最近更新 更多