1. 程式人生 > >冒泡、快速排序演算法

冒泡、快速排序演算法

氣泡排序:

        效果:

 原理:

          簡單來說就是兩兩比較大小一個外層迴圈裡面套一個內層迴圈

將大的數放在最後,通過迴圈實現排序

程式碼實現:

$arr=array(1,43,54,62,21,66,32,78,36,76,39);  
function getpao($arr)
{  
  $len=count($arr);
  //設定一個空陣列 用來接收冒出來的泡
  //該層迴圈控制 需要冒泡的輪數
  for($i=1;$i<$len;$i++)
  { //該層迴圈用來控制每輪 冒出一個數 需要比較的次數
    for($k=0;$k<$len-$i;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}


print_r(getpao($arr));

結果:

   
      Array( [0] => 1 [1] => 21 [2] => 32 [3] => 36 [4] => 39 [5] => 43 [6] => 54 [7] => 62 [8] => 66 [9] => 76 [10] => 78)

快速排序:

      示例圖:

  

原理:

      重點就是遞迴

      選中一個元素為根,其他元素通過與選中元素對比大小,放入對應的陣列中,在遞迴呼叫本身將放好的陣列進行排序,最後進行合併,從而達到排序的效果

程式碼:

$arr=array(1,43,54,62,21,66,32,78,36,76,39); 

function quick_sort($arr) {
    //先判斷是否需要繼續進行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //如果沒有返回,說明陣列內的元素個數 多餘1個,需要排序
    //選擇一個標尺
    //選擇第一個元素
    $base_num = $arr[0];
    //遍歷 除了標尺外的所有元素,按照大小關係放入兩個陣列內
    //初始化兩個陣列
    $left_array = array();//小於標尺的
    $right_array = array();//大於標尺的
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左邊陣列
            $left_array[] = $arr[$i];
        } else {
            //放入右邊
            $right_array[] = $arr[$i];
        }
    }
    
    //再分別對 左邊 和 右邊的陣列進行相同的排序處理方式
    //遞迴呼叫這個函式,並記錄結果
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    //合併左邊 標尺 右邊
    return array_merge($left_array, array($base_num), $right_array);
}

$li = quick_sort($arr);

print_r($li);

結果:

  y( [0] => 1 [1] => 21 [2] => 32 [3] => 36 [4] => 39 [5] => 43 [6] => 54 [7] => 62 [8] => 66 [9] => 76 [10] => 78)

二分查詢(二叉樹也時同樣的原理)

  就是將排序好的資料通過對半來更加快速的查詢到目標

二分查詢:

http://www.tuicool.com/articles/2MbAR3q
http://blog.csdn.net/xzjxylophone/article/details/4714326
1,2,3,4,5,6,7
我現在要查詢7
我先取出中間數 4
判斷下是不是要找的數字,發現小了
就去右邊查詢
然後取出右邊的所有的數
取出她們幾個的中間數 6 
發現還小了
繼續找右邊的陣列
找到7了 ok了!!!

最差的一種情況就是這個數字不存在 ====


 1 <?php
 2     #二分查詢
 3     function binarySearch(Array $arr, $target) {
 4         $low = 0;
 5         $high = count($arr) - 1;
 6         
 7         while($low <= $high) {
 8             $mid = floor(($low + $high) / 2);
 9             #找到元素
10             if($arr[$mid] == $target) return $mid;
11             #中元素比目標大,查詢左部
12             if($arr[$mid] > $target) $high = $mid - 1;
13             #重元素比目標小,查詢右部
14             if($arr[$mid] < $target) $low = $mid + 1;
15         }
16         
17         #查詢失敗
18         return false;
19     }
20     
21     $arr = array(1, 3, 5, 7, 9, 11);
22     $inx = binarySearch($arr, 1);
23     var_dump($inx);
24 ?>