PHP 排序算法(四) 快速排序

快速排序

思路:

  1.  我們首先要找到一個基準,數組的前半部分是比基準小的元素,數組後半部分是比基準大的元素,這裏我就拿數組第一個元素作爲基準;
  2.  設置隊首和隊尾兩個指針;
  3.  隊尾指針先進行活動,一直向隊首移動,直到找到比基準值小的元素,然後將這個值賦給隊首指針處;
  4.  下面隊首指針開始活動,一直向隊尾移動,直到找到比基準值大的元素,然後將這值賦給隊尾指針處;
  5.  等到隊首指針和隊尾指針指向同一處時,將基準值賦給當前指針指向的同一位置,此時,基準元素前面的都是比它要小的元素,後面都是比它大的元素;
  6. 接下來,就是採用上述步驟將兩邊的部分分別進行排序,如此循環下去,直至開始的low>=開始的high,說明就剩下了一個元素,也就無需再排了。
/**
 * @param $arr
 * @param $low
 * @param $high
 * @return mixed
 */
function quickSort(&$arr,$low,$high){
    if($low < $high){
        $index = getIndex($arr,$low,$high);
        quickSort($arr,0,$index-1);
        quickSort($arr,$index+1,$high); 
    }
    return $arr;
}

/**
 * @param $arr
 * @param $low
 * @param $high
 * @return mixed
 */
function getIndex(&$arr,$low,$high){

    $tmp = $arr[$low];

    while($low < $high){
        //如果隊尾元素值大於基準元素,那麼high--
        while($low < $high && $arr[$high] > $tmp){
            $high--;
        }
        //如果隊尾元素小於基準值,那麼就將隊尾元素賦值給隊首元素
        $arr[$low] = $arr[$high];
        //如果隊首元素小於基準值,那麼low++
        while($low < $high && $arr[$low] < $tmp){
            $low++;
        }
        //如果隊首元素大於基準值,就將隊首元素賦值給隊尾元素
        $arr[$high] = $arr[$low];
    }

    //退出時,high == low
    $arr[$low] = $tmp;
    return $low;
}


$arr = array(4,5,1,6,2,8,3,11,10);
print_r(quickSort($arr,0,count($arr)-1));

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章