畫江湖之演算法篇 [排序演算法] 快速排序

Krisji發表於2019-03-20

1 快速排序簡介

概括:

  • 快速排序的基本思想:透過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
    小夥伴們仔細看下面的動態圖哦

完整程式碼塊

public static function quick($arr){
        if(count($arr)<=1){
            return $arr;
        }

        $k=$arr[0];
        $x=array();
        $y=array();
        $_size=count($arr);
        for($i=1;$i<$_size;$i++){
            if($arr[$i]<=$k){
                $x[]=$arr[$i];
            }elseif($arr[$i]>$k){
                $y[]=$arr[$i];
            }
        }
        $x=Sort::quick($x);
        $y=Sort::quick($y);
        return array_merge($x,array($k),$y);
    }

2 分析程式碼塊 具體分析到程式碼註釋哦 ~

快速排序

public static function quick($arr){
        if(count($arr)<=1){ //如果陣列根本就一個元素就直接返回 不用在排序咯
            return $arr;
        }

        $k=$arr[0];//定義一個初始要排序的值 預設為陣列第一個
        $x=array();//定義比要排序的值 小的陣列塊
        $y=array();//定義比要排序的值 大的陣列塊
        $_size=count($arr);//統計陣列的大小
        for($i=1;$i<$_size;$i++){//迴圈陣列 記住這邊要從索引1 開始
            if($arr[$i]<=$k){//如果當前的值小於 要排序的值
                $x[]=$arr[$i];//就把小於的值放到 小的陣列塊中
            }elseif($arr[$i]>$k){//如果當前的值大於 要排序的值
                $y[]=$arr[$i];//就把大於的值放到 大的陣列塊中
            }
        }
        $x=Sort::quick($x);//依次遞迴執行 這樣就會得到小的陣列塊
        $y=Sort::quick($y);//依次遞迴執行 這樣就會得到大的陣列塊
        return array_merge($x,array($k),$y);//最後在合併下 小的模組+中間的模組【初始要排序的值】+大的模組 就ok~
    }
    // print_r(Sort::quick($arr));

3 時間複雜度 分析

file

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章