【问题标题】:Sorting algorithm not working排序算法不起作用
【发布时间】:2014-12-11 03:08:53
【问题描述】:

我的排序算法不断输出 10-15 个相同的数字,它假设对我的数组进行排序,该数组的大小为 2000,数字为 1-100。这是我一直在编码的家庭作业 在 C++ 中学习了 4 个月,我整天都在研究它,它的到期时间是 12:00。请帮忙。就是想不通算法

//Function to sort the numbers
void sortNumbers(int nums[], int ARRAY_SIZE) {
    int startScan, minIndex, minValue;
    for (startScan = 0; startScan < (ARRAY_SIZE-1); startScan++) {
        minIndex = startScan;
        minValue = nums[startScan];

        for(int index = startScan+1; index < ARRAY_SIZE; index++) {
            if(nums[index]<  minValue) {
                minValue = nums[index];
                minIndex = index;
            }

            nums[minIndex] = nums[startScan];
            nums[startScan] = minValue;
        }
    }
}

【问题讨论】:

  • 您缺乏计划并不构成我们的紧急情况。下一次,早点开始你的家庭作业。并且请不要认为我过于苛刻,我必须告诉我自己的儿子同样的该死的事情。有时失败是件好事,它让你下次失败的可能性更小,让你为现实世界做好准备:-)
  • 冒泡排序是最容易实现的。如果你想交一些东西,重写它,让它进行冒泡排序。
  • 但是,如果您学习了一些基本的调试技能(在实际调试器中或通过明智地放置printf 语句),您应该能够弄清楚发生了什么。当最重要的技能是调试时,机构往往会专注于编码。恕我直言。
  • 还有一件事:keeps turning out 10-15 each of the same number,您知道知道 2000 个数字都在 1-100 范围内,平均每个数字大约有 20 个副本,对吧?而且,如果你对它们进行排序,你会看到:1 1 1 1 1 2 2 2 2 3 3 3 3...(但每个大约有 20 个)。你确定你不只是向风车倾斜吗?
  • 要检查这一点,请从原始的 2000 元素数组开始,计算每个数字 (1-100) 的数量。然后对您的排序数组执行相同的操作。如果计数在排序前和排序后相同,则没有问题。

标签: c++ sorting


【解决方案1】:

您只需要在内循环之外进行交换。

获取这部分

nums[minIndex] = nums[startScan];
nums[startScan] = minValue;

在内循环之外。

您的代码应如下所示:

void sortNumbers(int nums[], int ARRAY_SIZE) {
    int startScan, minIndex, minValue;
    for (startScan = 0; startScan < (ARRAY_SIZE-1); startScan++) {
        minIndex = startScan;
        minValue = nums[startScan];

        for(int index = startScan+1; index < ARRAY_SIZE; index++) {
            if(nums[index]<  minValue) {
                minValue = nums[index];
                minIndex = index;
            }
        }

        nums[minIndex] = nums[startScan];
        nums[startScan] = minValue;
    }
}

这里有一个非常清晰的选择排序图片和步骤说明:http://www.algolist.net/Algorithms/Sorting/Selection_sort

【讨论】:

    【解决方案2】:

    您所做的事情的概念没有任何问题,我只关注倒数第三个右大括号 } 的位置。

    当内部循环的全部意图是找到你想要交换的元素时,你真的想在inner循环内部进行交换吗?根据定义,在循环完成之前您无法找到它。


    尝试自己弄清楚,但如果由于某种原因无法解决,请参见下文:

    void sortNumbers(int nums[], int ARRAY_SIZE) {
        int startScan, minIndex, minValue;
    
        // For every array index bar the last.
    
        for (startScan = 0; startScan < (ARRAY_SIZE-1); startScan++) {
            // Start with minimum at that point.
    
            minIndex = startScan;
            minValue = nums[startScan];
    
            // Check against every other array element not yet placed.
    
            for(int index = startScan+1; index < ARRAY_SIZE; index++) {
                if(nums[index]<  minValue) {
                    minValue = nums[index];
                    minIndex = index;
                }
            }
    
            // Swap when you've found the minimum.
    
            nums[minIndex] = nums[startScan];
            nums[startScan] = minValue;
        }
    }
    

    【讨论】:

      【解决方案3】:

      所有排序例程都需要一个被交换值的临时副本。交换。想想这个的必要性。突出的第一件事是我看不到任何地方的交换。您正在破坏您的价值观,导致它们重复。你从哪里得到这个设计?

      【讨论】:

      • 大师,您可能会发现minValue是这种情况下的临时副本。因此交换 正在发生,它只是非常迟钝。
      • 计数排序不使用交换,尽管我同意 OP 可能应该上课。
      【解决方案4】:

      2000 > 100,您可能会发现 bucketsort -> counting sort 是解决您当前问题的合适方法。

      编辑:英文:你有一个由 100 个整数组成的数组,用于记录输入中的数字

      正如其他人所提到的,您的排序甚至没有正确交换值。

      【讨论】:

        猜你喜欢
        • 2014-12-30
        • 2014-04-18
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        • 2021-03-06
        • 1970-01-01
        相关资源
        最近更新 更多