1. 程式人生 > >選擇排序

選擇排序

[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); ?>

選擇排序