1 <?php 2 3 $arr=array(1,43,54,62,21,66,32,78,36,76,39); 4 5 //实现思路 双重循环完成,外层控制轮数,当前的最小值。内层 控制的比较次数 6 function selectSort($arr) { 7 //$i 当前最小值的位置, 需要参与比较的元素 8 for($i=0, $len=count($arr); $i<$len-1; $i++) { 9 //先假设最小的值的位置 10 $p = $i; 11 12 //$j 当前都需要和哪些元素比较,$i 后边的。 13 for($j=$i+1; $j<$len; $j++) { 14 //$arr[$p] 是 当前已知的最小值 15 //比较,发现更小的,记录下最小值的位置;并且在下次比较时, 16 if($arr[$p] > $arr[$j]) { 17 // 应该采用已知的最小值进行比较。 18 $p = $j; 19 } 20 } 21 22 //已经确定了当前的最小值的位置,保存到$p中。 23 //如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可 24 if($p != $i) { 25 $tmp = $arr[$p]; 26 $arr[$p] = $arr[$i]; 27 $arr[$i] = $tmp; 28 } 29 } 30 31 //返回最终结果 32 return $arr; 33 } 34 35 $arr = selectSort($arr); 36 37 echo "<pre>"; 38 print_r($arr); 39 40 41 42 43 /* 44 Array 45 ( 46 [0] => 1 47 [1] => 21 48 [2] => 32 49 [3] => 36 50 [4] => 39 51 [5] => 43 52 [6] => 54 53 [7] => 62 54 [8] => 66 55 [9] => 76 56 [10] => 78 57 ) 58 */
该算法使用了交换操作,仅使用了一个辅助单元, 因此其算法空间复杂度为O(1)
时间复杂度如下所示:
T(n) = ∑i=1n-1 (n-i) = n(n-1) / 2 = O(n2)