【问题标题】:Can't understand this selection-sort algorithm, what causes loop to stop and swap? C++看不懂这个选择排序算法,是什么导致循环停止和交换? C++
【发布时间】:2021-07-01 00:23:56
【问题描述】:

我不明白内部 for 循环是如何在找到一个通过 if 语句中的测试表达式的值后停止的。我期待内部 for 循环继续迭代,不管当前迭代的值是否满足 if 语句中的测试表达式。

我预计会发生这种情况,因为在我看来,在内循环标头中,只要索引小于数组的大小,它就应该继续迭代,但是它不会继续并跳回外循环执行交换...

我不明白是什么阻止了内部 for 循环迭代每个元素中的每个值,无论它是否通过 if 语句中的测试表达式。有谁能解惑吗?

谢谢

void selectionSor(int array[], int size)
{
     int minIndex, minValue;
     for (int start = 0; start < (size - 1); start++)
     {
          minIndex = start;
          minValue = array[start];
          for (int index = start + 1; index < size; index++)
          {
               if (array[index] < minValue)
               {
               minValue = array[index];
               minIndex = index;
               }
          }
     
        swap(array[minIndex], array[start]);
}

【问题讨论】:

  • 是什么让你认为内循环提前停止了?
  • 我不明白是什么阻止了内部 for 循环迭代每个元素中的每个值,无论它是否通过 if 语句中的测试表达式。 -- 如果您使用调试器单步调试代码,您可以自行回答。
  • 如果index &gt;= size,内部循环将停止。没有魔法发生。
  • 这正是您的调试器的用途。您的调试器将允许您一步一步、一次一行地执行该程序,并检查所有变量的值并监控它们如何变化。您是否已经尝试过使用调试器,如果没有,为什么不呢?如果你这样做了,你看到了什么,你不清楚吗?
  • 你走运了! Visual Studio 拥有最容易使用的调试器之一。 I'd start reading here

标签: c++ for-loop selection-sort


【解决方案1】:

选择排序执行较少的交换,因为它将项目立即移动到它们在数组中的最终位置。它的工作原理是:找到数组中的最小值并将其移至元素 0。然后找到下一个最小值并将其移至元素 1。此过程继续进行,直到所有元素都按正确的顺序放置。因此,存储在元素 5 中的 1 与存储在元素 0 中的 5 交换。算法然后重复该过程,但元素 0 已经包含数组中的最小值,因此可以省略。因此,算法从元素 1 开始扫描,然后是元素 2,然后是元素 3,然后是其他所有元素。伪代码:对于 startScan 设置为数组中从 0 到倒数第二个下标的每个下标→将索引变量设置为 startScan。 →将 minIndex 变量设置为 startScan。 →将 minValue 变量设置为 array[startScan]。 →For index 设置为数组中从 (startScan + 1) 到最后一个下标的每个下标→如果 array[index] 小于 minValue→将 minValue 设置为 array[index]。 →将 minIndex 设置为索引。 →结束如果。 →结束。 →将数组[minIndex] 设置为数组[startScan]。 →将数组[startScan] 设置为 minValue。 →结束。内部 for 循环序列通过数组,从数组 [startScan + 1] 开始,搜索具有最小值的元素。当找到元素时,它的下标存储在变量 minIndex 中,它的值存储在 minValue 中。然后外循环与 array[startScan] 交换这个元素的内容并递增 startScan。重复此过程,直到每个元素的内容都已移动到它们的正确位置。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
相关资源
最近更新 更多