这个嵌套循环的简单解释是什么?

时间:2014-01-23 13:46:26

标签: c unix

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main(){    
        int ctr, inner, outer, didSwap, temp;
        int nums[10];
        time_t t;

        srand(time(&t));

        for (ctr = 0; ctr < 10; ctr++){
          nums[ctr] = (rand() % 99) + 1;
        }

        // Now list the array as it currently is before sorting
        puts("\nHere is the list before the sort:");
        for (ctr = 0; ctr < 10; ctr++) {
          printf("%d\n", nums[ctr]);
        }

        // Sort the array
        for (outer = 0; outer < 9; outer++) {
          didSwap = 0; //Becomes 1 (true) if list is not yet ordered
          for (inner = outer; inner < 10; inner++) { // << I dont uunderstand this nested loop ?               
            if (nums[inner] < nums[outer]) {
              temp = nums[inner];
              nums[inner] = nums[outer];
              nums[outer] = temp;
              didSwap = 1;
            }
          }

          if (didSwap == 0) {
            break;
          }
        }

        // Now list the array as it currently is after sorting
        puts("\nHere is the list after the sort:");
        for (ctr = 0; ctr < 10; ctr++) {
          printf("%d\n", nums[ctr]);
        }

   return(0);
}

我有时会对代码感到困惑,这本代码来自一本为我这样的新手教授C编程的书,它将随机数从顶部的较低值到底部的最大值进行排序。我遇到了嵌套循环试图弄清楚它是如何工作的我仍然不确定它是如何工作的。为什么变量outter的值被赋给变量inner?我理解第一个循环因为outter < 9而重复嵌套循环8次,这对我来说没有意义,因为数组由10个元素组成。我糊涂了!所以outter应该重复9次嵌套循环?也许 ?它可能是!

for (inner = outer; inner < 10; inner++) { // << I don't understand this nested loop ? 
  if (nums[inner] < nums[outer]) {
    temp = nums[inner];
    nums[inner] = nums[outer];
    nums[outer] = temp;
    didSwap = 1;
  }
}

2 个答案:

答案 0 :(得分:1)

基本上,嵌套循环中的代码表示:

loop from the first element to the next-to-last element:

   loop from the current value of the outer loop, to the last element, 
     looking for a smaller value than the one I am looking at in the outer loop.
     if you find a smaller value, swap it into place. 
   if you didn't swap anything during this inner loop, exit; << BUG??

首先,我认为算法有一个错误:内循环结束时的didswap=0条件只表示当前位置小于它下面的值;除非我误读了某些内容,否则并不意味着整个列表都已排序,所以我认为这已被打破。 (例如:如果你定义你的列表以便最小元素从零位开始,我认为整个事情都会退出而不交换任何东西,无论列表的其余部分是如何排序的。但是,didswap是一个优化:无论如何,循环都会在没有did swap标志的情况下终止,因此我暂时将它完全取出并考虑主要算法。

但是让我们看一下,了解其余代码正在做什么: outer = inner确保内部循环从外部循环当前开始。 (所以:从第0个元素开始。从元素0循环到元素10,如果你发现一个小于当前元素0的元素,将它与元素0交换并继续搜索。一旦内部循环到达元素10,你知道元素0必须是整个列表中的最小元素,因为你要与列表中的每个其他元素进行比较。现在,我们查看位置1(外部= 1)中的元素,并与位置1到位置的每个元素进行比较10,寻找小于1位置的元素,如果我们找到它,我们交换元素。所以当我们完成内环的第二遍时,我们知道位置1的元素是第二小的数组中的元素。然后我们继续查看第三个元素等。

注意:这里有一点效率低下:你可以从inner = outer+1开始,因为nums [i]&lt; nuns [i],所以浪费了内循环的第一次迭代。但老实说,这种类型的分类是非常低效的,这种变化是在噪音中。有许多更有效的排序算法,我肯定会在您的文本中稍后介绍。

答案 1 :(得分:0)

  

为什么将变量outter的值赋给变量inner

将内循环从outter迭代到9。这是因为nums[0]nums[outer-1]的所有元素都已经排序了。

  

我理解第一个循环因8而重复嵌套循环outter < 9次,这对我来说没有意义,因为数组由10个元素组成。

外循环应该只迭代9次。这是因为无需对最后一个元素num[9]进行排序。排序9元素后,它出现在数组的最后。