-
-
- 选择排序算法
-
原理:
遍历一个数组,在此过程中,找出数组中的最大值及其位置。然后将该最大值的单元,跟数组的最后一个单元“交换位置”,这样进行一趟,数组中的最大值就一定放在最后位置了。
将上述过程中剩余的数据继续遍历一次,并做同样的事情,则此时剩余部分的最大值也能够放在剩余部分的最后位置——对整体而言就是倒数第二的位置。
依此类推。。。。。。。进行若干次,就排好了。
图示:
有数组:$arr1 = array(18, 22, 12, 15, 23, 9);
| 原始数组 |
18 |
22 |
12 |
15 |
23 |
9 |
| 第1趟之后 |
18 |
22 |
12 |
15 |
9 |
23 |
| 第2趟之后 |
18 |
9 |
12 |
15 |
22 |
23 |
| 第3趟之后 |
15 |
9 |
12 |
18 |
22 |
23 |
| 第4趟之后 |
12 |
9 |
15 |
18 |
22 |
23 |
| 第5趟之后 |
9 |
12 |
15 |
18 |
22 |
23 |
规律总结:
- 要进行从头到尾找出其中的最大值(及下标),并进行交换的趟数为$n-1,$n为数组长度
- 每一趟要做的事情是:a)找最大值,吧)并将该最大值跟这一趟的最后一项进行交换;
- 每一趟要从中找最大值的数据个数都比前一趟少1,其中第一趟有$n个。
<?php
/*
规律总结:
1,要进行从头到尾找出其中的最大值(及下标),并进行交换的趟数为$n-1,$n为数组长度
2,每一趟要做的事情是:a)找最大值,吧)并将该最大值跟这一趟的最后一项进行交换;
每一趟要从中找最大值的数据个数都比前一趟少1,其中第一趟有$n个。*/
$arr1 = array(18, 22, 12, 15, 23, 9);
//implode("字符", $数组):将该数组的所有项用给定字符“连接起来”
echo "<br>交换前:" . implode(',' , $arr1);
$n = count($arr1);
//控制进行从中找最大值的趟数:
for($i = 0; $i < $n - 1; $i++)
{//a)找最大值(及下标)://这个循环是在其中某一趟中从前(若干)个数据中找最大值$max = $arr1[0]; //取出这些数据中的第一项,并该变量作为最大值$max_key = 0; //对应的下标for($k = 0; $k < $n - $i; $k++){if($arr1[$k] > $max){$max = $arr1[$k];$max_key = $k;}}//b)交换:$temp = $arr1[$max_key]; //$max_key为这一趟找出来的最大值的下标$arr1[$max_key] = $arr1[$n-1-$i]; //$n-1-$i为这一趟最后一项的下标$arr1[$n-1-$i] = $temp;
}
echo "<br>交换后:" . implode(',' , $arr1);$arr1 = array(18, 22, 12, 15, 23, 9);
$n = count($arr1);
for($i=0;$i<$n-1;$i++) //交换的趟数为n-1
{$max = $arr1[0]; //假装定义最大值为第一个$max_key = 0;for($k=0;$k<$n-$i;$k++) {if($arr1[$k]>$max){$max = $arr1[$k];$max_key = $k;}}$temp = $arr1[$max_key];$arr1[$max_key] = $arr1[$n-1-$i];$arr1[$n-1-$i] = $temp;
}
print_r($arr1);