2017-03-04 59 views
1

我没有留下任何机会,只能在这里注册,寻求澄清我正在努力理解的一个问题。 我是一个接近零编码体验的虚拟人,并且正在学习AppleScript以及我正在阅读的教科书(H.Rosenthal,H.Sanderson。Mac OSX.2010上的脚本和自动化综合指南,第3版)我偶然发现根据Bubble排序的简要概述。有问题的例子是:不知道布尔人在臭名昭着的气泡排序中的用法

on bubblesort(the_list) 
    set is_sorted to false 
    repeat until is_sorted 
    set is_sorted to true 
    repeat with i from 1 to (count the_list) 
    if item i of the_list > item (i + 1) of the_list then 
    set {item i of the_list, item (i + 1) of the_list} to {item (i + 1) of  the_list, item i of the_list} 
    set is_sorted to false 
    end if 
    end repeat 
    end repeat 
    end bubblesort 

我明白冒泡排序的要领,我知道循环是如何工作的,以及当一个人应该使用“重复”的语句。我无法理解的是布尔的使用,我没有找到关于在这个算法中使用布尔值的问题以及这两个环路如何相互影响的解释。这里是我的逻辑,请大家指正我缺少其中:

  1. 由于排序,我们要应用到给定列表的类型是一个循环的过程,我们将利用2种重复循环:“重复与......从...到...“循环遍历the_list的每个条目,并”重复直到“执行尽可能多的过程所需的过程。
  2. “重复直到”将是一个外部循环,而“重复...从...到...”将嵌套在前者中。
  3. 外循环的布尔表达式将是一个新创建的变量is_sorted的值,正如它的类所暗示的那样,它将存储一个变化的值。由于必须定义任何变量,因此我们将其设置为循环外的“false”。
  4. item i of the_list > item (i + 1)时,内循环的条件语句“if”假设为“true”。如果满足这个条件,则is_sorted获取“false”(就像它已经设置)。最终当列表中的所有项目(the_list)被排序时,这个条件将变为“true”,因此将是is_sorted的值。我对吗?所以这里的问题出现了:

  5. 列表项

    • 有什么动作的确切顺序?
    • 内部循环中的动作是首先执行还是从上到下两个循环中的所有动作都是?
    • 当is_sorted获取“false”值后,此变量的输出指向哪里?
    • 当内循环的is_sorted变量为“false”时,动作“跳动”重复,直到is_sorted设置为“false”?
    • 内循环中的is_sorted如何与外循环的is_sorted对话?为什么立即将is_sorted的值改为“true”后立即声明为“false”?
    • is_sorted在内循环响应内循环结果之前如何设置为true?

这是很难制定这些问题,所以如果我给我的反应将不胜感激。我肯定我跳过了一些我只是忘记了的问题,但幸运的是,稍后会恢复。

Visualisation of my understanding of bubble sort

+1

请将您的问题简化为简短易懂的内容 –

+0

我刚刚参加了此讨论区的讨论,因此我正试图进入整个格式化问题,这里的内容相当复杂。 – scrutinizer1

回答

0

在臭名昭著的泡沫布尔的使用率排序

这应该只是一个布尔值,is_sorted。它被用作冒泡排序的早期退出优化。外部循环将is_sorted设置为true,并且如果内部循环中的代码检测到不按顺序的元素,则除了交换元素外,它还会将is_sorted设置为false。这可能是更容易理解这一点,如果在伪代码缩进:

bubblesort(the_list) 
    set is_sorted to false 
    repeat until is_sorted 
     set is_sorted to true 
     repeat with i from 1 to (count the_list) 
      if item i of the_list > item (i + 1) of the_list then 
       set {item i of the_list, item (i + 1) of the_list} to 
        {item (i + 1) of the_list, item i of the_list} 
       set is_sorted to false 
      end if 
     end repeat 
    end repeat 
end bubblesort 

的替代性名称和布尔的意义将是一个指标,如果任何交换发生,如果没有交换发生,则该元素将被排序。在这种情况下,交换最初将设置为true,然后在外部循环中设置为false,并在内部循环中设置为true(如果检测到并交换了任何无序单元)。

+0

您编辑过的部分“如果发生任何掉期,布尔值的替代名称和意义将成为一个指标,如果没有掉期,那么这些元素将被排序。在这种情况下,在外部循环中掉期将被设置为false,如果检测到任何乱序元素并进行交换,则在内部循环中设置为true。“因为它的解释性质,实际上很好。这是我不明白是否“直到is_sorted重复”是指“重复直到假”或“重复直到真”?什么时候外循环的is_sorted有“真”,什么时候有“假”? – scrutinizer1

+0

@ scrutinizer1 - 感谢您的支持。我回来并更新以解释初始设置(true,然后在外循环中设置为false)。 “重复直到is_sorted”意味着重复,直到“is_sorted”为真。所以初始设置为false,外部循环将其设置为true,并且如果检测到乱序元素(这也意味着交换发生),则内部循环将其设置为false。对于“交换发生”布尔值,真/假将被颠倒,并且外部循环将“重复,直到没有交换发生”。 – rcgldr

+0

我编辑了我的原始文章,添加了一张我如何想象气泡排序内部运作的图片。我发现它在执行外层循环语句开始后立即用true替换false。如果内部循环交换两个项目,那么外部循环的is_sorted在下一个表达式中再一次被设置为“false”,仅仅被改变为“true”。我对么? 如果连续两个项目被排序,即条件语句不是真的,那么......会发生什么?它跳过循环?但是,如果是这样,那么它如何管理到列表的末尾循环播放其余的项目? – scrutinizer1