0

我正在研究 php 的冒泡排序策略,您可以在此处查看代码,在主循环中,有两个条件必须为真,因此循环将运行,我知道该变量是因为我们不希望我们的循环运行,直到即使数组已经排序,它的最大迭代也是如此,但我不明白为什么我们需要检查我们是否已经进入最大迭代?为什么我们不能只检查变量(我的假设是我们可以在变量处遇到一些问题并且我们不想要一个永恒的循环)。无论如何我不确定,如果有人能告诉我为什么我们不需要只检查主循环中的变量,我将非常感激,谢谢大家,祝你有美好的一天。

function sort(array &$vec)
    {
        $sorted = false;
        $size = sizeof($vec);
        for($i=0; $i<=$size-2 && !$sorted; $i++)
        {
            $maybeSorted = true;
            $from = 0;
            $till = $size-1-$i;
            for($j=$from; $j<$till; $j++)
            {
                if($vec[$j]>$vec[$j+1])
                {
                    $maybeSorted = false;
                    $temp = $vec[$j];
                    $vec[$j] = $vec[$j+1];
                    $vec[$j+1] = $temp;
                }
            }
            if($maybeSorted)
            {
                $sorted = true;
            }
        }
    }
4

1 回答 1

0

你可以查看这个维基百科链接,在那里你可以找到伪代码中的算法。尝试理解每一步,并在您喜欢的语言中开始新的实施。这是学习某事的最好方法。新的!

冒泡排序在每一轮中执行类似交换元素的操作并重复此操作,直到最后一轮没有任何交换。

更新一个好的冒泡排序算法的一些例子:

function sort(array &$vec) {
  $n = sizeof($vec);

  do {
    $newn = 1;
    for ($i = 0; $i < ($n - 1); $i++) {
      if ($vec[$i] > $vec[$i + 1]) {
        $tmp         = $vec[$i];
        $vec[$i]     = $vec[$i + 1];
        $vec[$i + 1] = $tmp;
        $newn        = $i + 1;
      }
    }
    $n = $newn;
  } while ($n > 1);
}
  1. 获取数组中元素的数量(我们希望现在没有排序)
  2. $n在有未排序的元素时循环$n > 1
  3. for循环中,我们遍历元素并检查它们是否需要交换
  4. 我们这样做直到没有元素可以交换,所以$n不是> 1

例子:

| 55 |  7 | 78 | 12 | 42 | 1. run
|  7 | 55 | 78 | 12 | 42 |
|  7 | 55 | 12 | 78 | 42 |
|  7 | 55 | 12 | 42 | 78 | last comparison
|  7 | 55 | 12 | 42 | 78 | 2. run
|  7 | 12 | 55 | 42 | 78 |
|  7 | 12 | 42 | 55 | 78 | last comparison (we now 78 is sorted!)
|  7 | 12 | 42 | 55 | 78 | 3. run
|  7 | 12 | 42 | 55 | 78 | sorted! (nothing was swapped)

(未经测试,但应该可以)我希望这会对你有所帮助。

于 2012-06-13T14:05:38.653 回答