1.冒泡排序演算法
過程:
1.遍曆整個數組,每兩兩相鄰的元素進行比較,如$a[$i]>$a[$i+1]則互換位置,每次比較消除一個逆序。
2.每一次迴圈後,下次再需要迴圈的次數減少1。
<?php // 冒泡排序 $arr = createarr(20); printarr($arr); popsort($arr); printarr($arr); function createarr($num=10){ $arr = array(); for($i=0; $i<$num; $i++){ array_push($arr, mt_rand(0,999)); } return $arr; } function printarr($arr){ echo 'arr:'.implode(',', $arr).'<br>'; } function popsort(&$arr){ for($i=0,$length=count($arr)-1; $i<$length; $i++){ for($j=0; $j<$length-$i; $j++){ if($arr[$j]>$arr[$j+1]){ $tmp = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $tmp; } } } } ?>
2.二分法插入排序
過程:
1.首先,原數組是一個有序序列,$low=0 $high=count($arr)-1。
2.將要插入的數與數組中間位置的元素進行比較,
如果比中間元素大,則$low=$mid+1作為下一次判斷的數組開頭。
如果比中間元素小,則$high=$mid-1作為下一次判斷的數組結尾。
3.直到$low>$high結束,$low就是新元素插入的位置。
4.將數組中從$low開始的元素全部向後移動一位,之後在$low位置插入新元素。
<?php // 二分法插入排序 $arr = createarr(20); $key = mt_rand(0,99); printarr($arr); echo 'key='.$key.'<br>'; binsort($arr, $key); printarr($arr); function createarr($num=10){ $arr = array(); for($i=0; $i<$num; $i++){ array_push($arr, mt_rand(0,99)); } sort($arr); // 有序序列 return $arr; } function printarr($arr){ echo 'arr:'.implode(',', $arr).'<br>'; } function binsort(&$arr, $key){ $low = 0; $high = count($arr)-1; while($low<=$high){ $m = $low + (int)(($high-$low)/2); $mkey = $arr[$m]; if($key>=$mkey){ $low = $m + 1; }else{ $high = $m - 1; } } // 移動插入位置之後的元素,插入新元素 for($i=count($arr)-1; $i>=$low; $i--){ $arr[$i+1] = $arr[$i]; } $arr[$low] = $key; } ?>