我现在对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
}