1. 程式人生 > >快速排序實現

快速排序實現

快速排序演算法那思想:氣泡排序的一種改進,基本思路是每進行一趟遍歷,將序列分割成兩個獨立的有序的部分,其實就是將整個序列看成兩個氣泡。在對含有n個元素的陣列S的一次快速排序過程中,設定low=0,height=n-1,已S[0]為給定值並賦值給t,從height開始向左遍歷並且height自減,找到第一個小於t的資料元素S[height],然後S[low]=S[height],再從low開始向右遍歷並且low自加,找到第一個大於t的資料元素S[low],然後S[height]=S[low],知道low=height為止時,最後將t賦值給S[low]或S[height]一次快速排序結束。

程式碼實現:

   /**
     * @name 陣列排序
     * @use 使用快速排序演算法對陣列進行排序,陣列型別為每個元素都含有“value”屬性用於排序
     * @param $height 指向排序段上邊界
     * @param $low 指向排序段下邊界
     * @param $arr 待排序陣列
     * @return $arr
     */
    public static function quickSort($height, $low, &$arr)
    {
        $randNum = rand($low, $height);
        $temp = $arr[$low];
        $arr[$low] = $arr[$randNum];
        $arr[$randNum] = $temp;
        $lowTemp = $low;
        $heightTemp = $height;
        $initNum = $arr[$low];
        $index = $low;
        $switch = true;//true為從高位向地位找,false為從低位向高位找
        while ($low != $height) {
            if ($switch) {
                if ($arr[$height]['value'] > $initNum['value']) {
                    $arr[$index] = $arr[$height];
                    $index = $height;
                    $switch = false;
                }
                $height--;
            } else {
                if ($arr[$low]['value'] < $initNum['value']) {
                    $arr[$index] = $arr[$low];
                    $index = $low;
                    $switch = true;
                } 
                $low++;
            }
        }
        $arr[$index] = $initNum;
        if ($lowTemp < $index - 1) {
            self::quickSort($index - 1, $lowTemp, $arr);
        }
        if ($heightTemp > $index + 1) {
            self::quickSort($heightTemp, $index + 1, $arr); 
        }
    }