有人可以解释一下里面的 PHP 数组排序代码是如何工作的


Can someone explain how PHP array sorting code inside works?

我现在对PHP有一些问题。我不知道如何创建一个代码,从最低到最高(相反)对数组中的数字进行排序。我只允许使用循环和条件而不使用 PHP 内置函数,所以我可以理解这些函数是如何工作的。

我在堆栈溢出排序数组值上找到了这段代码,而无需使用内置的 php,如 sort() 等:

<?php
$array=array('2','4','8','5','1','7','6','9','10','3');
echo "Unsorted array is: ";
echo "<br />";
print_r($array);

for($j = 0; $j < count($array); $j ++) {
    for($i = 0; $i < count($array)-1; $i ++){
        if($array[$i] > $array[$i+1]) {
            $temp = $array[$i+1];
            $array[$i+1]=$array[$i];
            $array[$i]=$temp;
        }       
    }
}
echo "Sorted Array is: ";
echo "<br />";
print_r($array);
?>

有人可以在每一行上逐步解释下面部分代码的工作原理吗?当试图理解这一点时,我会失去注意力。

for($j = 0; $j < count($array); $j ++) {
        for($i = 0; $i < count($array)-1; $i ++){
            if($array[$i] > $array[$i+1]) {
                $temp = $array[$i+1];
                $array[$i+1]=$array[$i];
                $array[$i]=$temp;
            }       
        }
    } 

放松一下。 :)这是最简单的代码之一。

在您的代码中:

<?php
$array=array('2','4','8','5','1','7','6','9','10','3');

用成员声明的数组

echo "Unsorted array is: ";
echo "<br />";
print_r($array);
/

/将输出数组的当前状况

for($j = 0; $j < count($array); $j ++) {

在这里,count($array) 将返回 10,因为数组中有 10 个成员。所以简单地说,它只是 for($j = 0; $j <10; $j ++)。这将循环通过 0-9。

for($i = 0; $i < count($array)-1; $i ++){

这里,count($array)-1 将返回 9。所以简单地说,它只是 for($i = 0; $i <9; $i ++)。这将循环通过 0-8。

    if($array[$i] > $array[$i+1]) {
            $temp = $array[$i+1];
            $array[$i+1]=$array[$i];
            $array[$i]=$temp;
        }       
    }
}

这是代码的主要部分。它检查数组成员是否大于其下一个成员。如果是这样,那么它会交换位置或代码继续,因为没有"else"语句。假设 i 的值为 0。然后 if($array[0]> $array[1])->if(2>4) 的答案是否定的,所以代码继续。假设 i 的值为 2。那么如果($array[2]> $array[3])->if(8>5) 的答案是肯定的,现在只是交换位置发生。$temp=5 然后$array[3]=$array[2],然后$array[2]=5。

echo "Sorted Array is: ";
echo "<br />";
print_r($array);
?>

只需打印排序后的数组。

您的代码看起来像是气泡排序的恶化变体:

let `$n` be `count($array)` for simplicity
for $n times
    go through each element in the array and compare to the next one
    if it is larger than the next one, swap the elements (swap is done using a temporary variable $temp)

这种交换确保在每一步之后,最大的元素将通过数组的末尾(拳头迭代确保最大的元素是最后一个,第二大元素在最后一个元素之前的位置),因此第一个优化是迭代元素更少($i < n变得$i < $n - $j)。

另一个优化是检查在电流环路($j loop)中是否执行了任何交换。无交换意味着数组是有序的,算法可以终止。

@Alexei是对的,这是一个简单的气泡排序变体。也许它会帮助你可视化正在发生的事情:

<?php
$array=array('2','4','8','5','1','7','6','9','10','3');
dump_array($array, 0);
for($j = 0; $j < count($array); $j ++) {
    for($i = 0; $i < count($array)-1; $i ++){
        if($array[$i] > $array[$i+1]) {
            $temp = $array[$i+1];
            $array[$i+1]=$array[$i];
            $array[$i]=$temp;
        }       
    }
    dump_array($array, $j+1);
}
function dump_array($array, $step) {
    foreach($array as $num) {
        echo sprintf("%02d", $num) . ", ";
    }
    echo " step $step ($step largest elements reached end of array)'n";
}
?>

输出:

02, 04, 08, 05, 01, 07, 06, 09, 10, 03,  step 0 (0 largest elements reached end of array)
02, 04, 05, 01, 07, 06, 08, 09, 03, 10,  step 1 (1 largest elements reached end of array)
02, 04, 01, 05, 06, 07, 08, 03, 09, 10,  step 2 (2 largest elements reached end of array)
02, 01, 04, 05, 06, 07, 03, 08, 09, 10,  step 3 (3 largest elements reached end of array)
01, 02, 04, 05, 06, 03, 07, 08, 09, 10,  step 4 (4 largest elements reached end of array)
01, 02, 04, 05, 03, 06, 07, 08, 09, 10,  step 5 (5 largest elements reached end of array)
01, 02, 04, 03, 05, 06, 07, 08, 09, 10,  step 6 (6 largest elements reached end of array)
01, 02, 03, 04, 05, 06, 07, 08, 09, 10,  step 7 (7 largest elements reached end of array)
01, 02, 03, 04, 05, 06, 07, 08, 09, 10,  step 8 (8 largest elements reached end of array)
01, 02, 03, 04, 05, 06, 07, 08, 09, 10,  step 9 (9 largest elements reached end of array)
01, 02, 03, 04, 05, 06, 07, 08, 09, 10,  step 10 (10 largest elements reached end of array)

再说一句。这是交换值的地方:

// Swap one element ($i) with it's successor ($i+1)
if($array[$i] > $array[$i+1]) {
  // We need a temporary var to store $array[$i+1]
  $temp = $array[$i+1];
  // Now that $array[$i+1] is stored, we can overwrite it with $array[$i]
  $array[$i+1]=$array[$i];
  // Use stored value to overwrite $array[$i]
  $array[$i]=$temp;
  // Now both values got swapped
}