選擇排序
阿新 • • 發佈:2017-05-25
[0 cells table border width 找出最大值 padding bsp 單元
演示數組為:
$a = array(9, 3, 5, 8, 2, 7); //下標為0,1,2,3,4,5
演算過程描述:
求得一個數組的最大值的下標,並將這個最大值下標的單元跟最後一個單元進行交換;
然後,繼續從剩余數據中取得最大值的下標,並將這個最大值下標的單元跟剩余的最後一個單元交換
以此類推,直到只剩下一個數據,就不用找了。
演示:
原始數組: |
9 |
3 |
5 |
8 |
2 |
7 |
第1趟後: |
7 |
3 |
5 |
8 |
2 |
9 |
第2趟後: |
7 |
3 |
5 |
2 |
8 |
9 |
第3趟後: |
2 |
3 |
5 |
7 |
8 |
9 |
第4趟後: |
2 |
3 |
5 |
7 |
8 |
9 |
第5趟後: |
2 |
3 |
5 |
7 |
8 |
9 |
規律描述:
1,假設數組的數據有n個。
2,要進行查找最大值單元並進行交換的“趟數”為n-1;
3,每一趟都要求出“剩余數據”中的最大值單元,並且,剩余數據的數量每一趟都少1個,第一趟有n個。
4,每一趟找出最大值單元後,都要進行交換:最大值單元,跟剩余數據中的最後一個單元交換。
代碼演示如下:
<?php $a = array(9, 3, 5, 8, 2, 7); //下標為0,1,2,3,4,5 /*規律描述: 1,假設數組的數據有n個。 2,要進行查找最大值單元並進行交換的“趟數”為n-1; 3,每一趟都要求出“剩余數據”中的最大值單元,並且,剩余數據的數量每一趟都少1個,第一趟有n個。 4,每一趟找出最大值單元後,都要進行交換:最大值單元,跟剩余數據中的最後一個單元交換。 */ echo "<br/>排序之前:"; print_r($a); //一頓排序。。。。。 $n = count($a); for($i = 0; $i < $n - 1; ++$i){//趟數 //每一趟開始找其中的最大值單元: $max = $a[0]; //找最大值先要取得第一項的值 $pos= 0; //找最大值的下標,也要先取得第一項的下標 for($k = 0; $k < $n-$i; ++$k){//註意這裏和冒泡的區別:一個是比較次數一個是剩余個數! //這裏,$k也可以理解為下標 if($a[$k] > $max){ $max = $a[$k]; $pos = $k; } } //前面一定可以獲得最大值及其所在下標:即最大值單元 //然後開始i進行交換: $t = $a[$pos]; //最大值的單元 $a[$pos] = $a[$n-$i-1];//$n-$i-1就是剩余數據中的最後一個單元的下標! $a[$n-$i-1] = $t; } echo "<br/>排序之後:"; print_r($a); ?>
選擇排序