1. 程式人生 > >排序算法(冒泡,選擇,插入,快速)查找算法(二分,快速)

排序算法(冒泡,選擇,插入,快速)查找算法(二分,快速)

元素 快速查找 冒泡排序 比較 簡單 目標 記錄 rec 向下取整

                        四種排序算法

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 “查無此人”;

    }

  }

排序算法(冒泡,選擇,插入,快速)查找算法(二分,快速)