排序算法(五)之快速排序

一、快速排序
什麼是快排?
快速排序的原理是什麼?
能不能用python代碼敲出一個實例?
同樣的,這篇文章也是要爲大家揭開這幾個疑惑。
快速排序:基本思想是任取待排序序列的一個元素作爲中心元素(可以用第一個,最後一個,也可以是中間任何一個),習慣將其稱爲pivot,樞軸元素;
將所有比樞軸元素小的放在其左邊;將所有比它大的放在其右邊
其次,快速排序用到了分而治之的思想,將一個數列分成兩個數列的方法爲:先從數列右邊找到一個比樞軸元素小的元素,將數列的第一個位置賦值爲該元素;
再從數列的左邊找到一個比樞軸元素大的元素,將從上面取元素的位置賦值爲該值;依次進行,直到左右相遇,把樞軸元素賦值到相遇位置。
我們通過例子來一步步看懂它的原理。比如:有一個列表【39,28,45,87,66,3,17,59】,請用快速排序的方法將其從小到大的升序排列出來
先找出一個基準元素,比方,咱們就拿最左邊的元素39作爲基準元素,來進行排序
既然挑選了最左邊的元素,那就從右邊開始
第一輪:①從右邊開始,59比39大,59放右邊不動;17比39小,那麼17就放最左邊 。這裏爲了方便顯示,假設17和39換了位置 【17,28,45,87,66,3,39,59】
    ②從左邊開始,28比39小,28不動;45比39大,45和39換了位置 【17,28,39,87,66,3,45,59】
    ③從右邊開始,3比39小,3和39換位置 【17,28,3,87,66,39,45,59】
    ④從左邊開始,87比39大,87和39互換位置 【17,28,3,39,66,87,45,59】
      因此,經過以上四步,就可以把比39小的統一排在左邊,比39大的統一排在了右邊
    經過了第一輪的排序,列表爲【17,28,3,39,66,87,45,59】;對這個列表進行分而治之,分開各一半一半
      【17,28,3,39】、【66,87,45,59】
第二輪:對拆分後的兩個小列表進行排序
    【17,28,3,39】先看第一個小列表,同樣的,以左邊第一個元素17爲基準元素,
    ①從右開始,39比17大,不動;3比17小,3和17換位置 【3,28,17,39】
    ②從左開始,28比17大,28和17換位置 【3,17,28,39】
      因此,比17大的都在右邊,比17小的,都在左邊
    再看第二個列表
    【66,87,45,59】,以左邊第一個元素66爲基準元素
    ①從右邊開始,59比66小,59和66換位置 【59,87,45,66】
    ②從左邊開始,87比66大,87和66換位置 【59,66,45,87】
    ③從右邊開始,45比66小,45和66換位置 【59,45,66,87】
      因此,比66小的,都在左邊
第三輪:再拆分,將兩個小的列表再拆分
      【3,17,28,39】和【59、45、66、87】
拆分爲【3、17】、【28、39】 和【59、45】、【66、87】
同樣的,在這四個小的列表中,均以左邊第一個元素爲基準元素,來比較大小,小的往左,大的往右;
  因此,可以分爲【3、17】以3爲基準元素,比3大的放右邊
        【28、39】 以28爲基準元素,比28大的放右邊
        【45、59】以45爲基準元素,比45大的放右邊
        【66、87】以66爲元素,比66大的放右邊
  最後合併,【3、17、28、39】【45、59、66、87】==》【3、17、28、39、45、59、66、87】
通過以上幾輪的比較有以下幾個特點
1、如果你選取了左邊第一個元素作爲基準元素,那麼就得從有右邊開始比較;同樣的,如果你選取了右邊的第一個元素作爲基準元素,那麼就得從左開始比較
2、從右邊排完,就得重新從左邊排,兩者是交替進行的
3、選取了基準元素後,比它大的放右邊,比它小的放左邊
4、就是運用了"分而治之"的思想,把長的數列不斷地分爲小的數列,最後又合起來

請看下面用筆畫的這張圖:

用python代碼來實現:

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