排序算法(冒泡,選擇,插入,快速)查找算法(二分,快速)
四種排序算法
1.冒泡排序
思路分析:從前往後相鄰的兩個數一次進行比較,大的往下沈,小的網上 冒。當相鄰的兩個數的比較後發現他們的排序與排序要求相反,就互換。
代碼實現
$arr = array (1,42,33,69,7,82,34,54,70,99);
$len = count($arr);
For($i=1;$i<$len;$i++){
For($j=0;$j<$len-$i;$j++){
If($arr[$j] > $arr[$j+1]){
$tmp = $arr[$j+1];
$arr[$j+1]=$arr[$j];
$arr[$j]=$tmp;
}
}
} 外層循環此處,內層循環輪數(冒出一個,比較一次)。
2.選擇排序
思路分析:選出最小的一個數與第一位的數交換。然後在剩下的數當中再找最小的與第二位置的數交換,如此循環到最後為止。
代碼實現:
$arr = array (1,42,33,69,7,82,34,54,70,99);
$len = count($arr);
For($i=0;$i<$len-1;$i++){
$p=$i; 假設最小的值
For($j=$i+1;$j<$len;$j++){
If($arr[$p]>$arr[$j]){
$p = $j; 發現更小的,記錄下最小值的位置,下次用小的比
}
}
已經確定了當前最小值的位置,保存到$p中,如果發現最小值的位置與當前假設的位置$i不同,則互換。
If($p != $i){
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
3.插入排序
思路分析:把N個數插入到已排列好的順序的數組中,使這N個數也是排序好的。
代碼實現:
$arr = array (1,42,33,69,7,82,34,54,70,99);
$len = count($arr);
For($i=1;$i<$len;$i++){
$tmp=$arr[$i];
For($j=$i-1;$j>=0;$j--){
If($tmp < $arr[$j]){ 發現插入的元素要小,交換位置.
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
}else{
Break;
}
}
}
4.快速排序
思路分析:選擇一個基準元素,通常選擇第一個元素或者最後一個元素。 通過一趟掃描,講排序列分成兩部分,一部分比基準元素小,一部分大於 等於基準元素。此時基準 元素在其排好序後的正確位置,然後再用同樣的 方法遞歸地排序劃分的兩部分。
代碼實現:
$arr = array (1,42,33,69,7,82,34,54,70,99);
Function digui($arr){
$len = count($arr);
If($len <= 1){
Return $arr; 是否要繼續執行
}
$base_num = $arr[0];
$left_array = array();
$right_array = array();
For($i=1;$i<$len;$i++){
If($base_num > $arr[$i]){
$left_array[] = $arr[$i];
}else{
$right_array[] = $arr[$i];
}
}
$left_array = digui($left_array);
$right_array = digui($right_array);
Return array_merge($left_array,array($base_num),$right_array);
}
兩種查找算法
1.二分查找
思路分析:
1.先取數組中間的值floor(low+top/2)
2.然後通過與所需查找的數字進行比較,若比中間值大,則將首位 替換 為 中間位置的下一位,繼續第一步的操作。若比中間值小, 則將尾值 替換 為中間值的上 一個位置,繼續第一步操作。
3.重復第二步操作直到找出目標數字。
比如從1,3,9,23,54中查找23。
首位置為0。尾位置為4,中間位置為2值為9,比23小。則首位置 更 新為2+1既為3。那麽接下來中間位置就為(3+4)/2=3, 值為 23,比 較相等既找到。
代碼實現:
非遞歸:
$target是要查找的目標 $arr是已經排序好的數組
function binary(&$arr,$low,$top,$target){
while($low <= $top){//由於php取商是有小數的,所以向下取整,不過也可不加,數組也會取整
$mid = floor(($low+$top)/2);
if($arr[$mid]==$target){
return $mid;
}elseif($arr[$mid]<$target){
$low = $mid+1;
}else{
$top = $mid-1;
}
}
return -1;
}$arr = array(1,3,9,23,54);echo binary($arr, 0, sizeof($arr), 9)
遞歸:
function binaryRecursive(&$arr,$low,$top,$target){
if($low<=$top){
$mid = floor(($low+$top)/2);
if($arr[$mid]==$target){
return $mid;
}elseif($arr[$mid]<$target){
return binaryRecursive($arr,$mid+1,$top,$target);
}else{
return binaryRecursive($arr,$low,$mid-1,$target);
}
}else{
return -1;
}
}
$arr = array(1,3,9,23,54);
echo binaryRecursive($arr, 0, sizeof($arr), 9);
1.快速查找
思路分析:太簡單 直接上代碼。
代碼實現:
$arr = array(40,99,700,0,-5);
Function search($arr,$findVal){
$flag = false;
For($i=0;$i<count($arr);$i++){
If($findVal==$arr[$i]){
Echo “找到了,下標=$i”;
$flag = true;
}
}
If(!$flag){
Echo “查無此人”;
}
}
排序算法(冒泡,選擇,插入,快速)查找算法(二分,快速)