【问题标题】:Understanding Bubble SORT了解冒泡排序
【发布时间】:2015-07-09 09:39:45
【问题描述】:
didswaps = 1;
while(didswaps){
    didswaps = 0;
    for(i=0; i<n-1; i++) {
        if(A[i]>A[i+1]) {
            int_swap(&A[i], &A[i+1]);
            didswaps = 1;
        }
    }    
}

在那里有 didswaps 有什么意义?

【问题讨论】:

  • 当数组在开始或在排序过程中排序时,它将通过提前中断来提高代码效率。所以循环不必运行 N*N 次。

标签: c while-loop bubble-sort


【解决方案1】:

它检测到工作尚未完成:一旦某些扫描没有进行任何交换,didswaps == 0 会导致循环终止,从而节省不必要的扫描时间。

【讨论】:

    【解决方案2】:

    如果didswaps仍然是0,则意味着每两个相邻元素都正确排序,因此它会更快(更早)结束排序算法

    【讨论】:

      【解决方案3】:

      通过观察n-th 遍历找到n-th 最大元素并将其放入最终位置,可以轻松优化冒泡排序算法。因此,内部循环可以避免在第n 次运行时查看最后的n-1 项。

      如果在特定的 pass 中没有交换,这意味着数组已经排序,所以我们不应该执行进一步的 pass。为此,我们可以有一个标志变量,在每次传递之前设置为 true,并在执行交换时设置为 false。

      didswaps 正是通过排除不必要的传递来完成此优化。

      【讨论】:

        【解决方案4】:

        每次交换 2 个元素时,您将 1 分配给 didswaps

        当您在循环结束时收到 didswaps &gt; 0 时,您进行了修改并且列表未排序。

        但是如果didswaps == 0你的列表是排序好的;)

        【讨论】:

        • 他不是“+1”,而是“=1”。
        • @CiaPan 对!对不起。尽管如此,算法仍然保持不变
        【解决方案5】:

        BubleSort 遍历列表直到不需要交换,这表明列表已排序。

        didswaps 表示是否发生了交换 (didswaps = 1)。如果没有发生交换,则对列表进行排序,因此应该中断 while 循环(didswaps = 0)。 didswaps 用作布尔值,它只能假设值 0 或 1。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-22
          • 2013-10-09
          • 1970-01-01
          • 2015-09-12
          • 1970-01-01
          • 2017-03-19
          • 2014-03-26
          • 2015-03-06
          相关资源
          最近更新 更多