Python排序算法--快速排序

2022-01-06 小九愛學習

收錄於話題 #Python_排序算法 7個

概念

快速排序(Quick sort)是由東尼·霍爾所發展的一種排序算法。在平均狀況下,排序 n 個項目要 Ο(nlogn) 次比較。在最壞狀況下則需要 Ο(n2) 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 Ο(nlogn) 算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。我們可以從名字就可以看出快速排序存在的意義就在於:快,而且效率高,它是處理大數據最快的排序算法之一。快速排序同樣也是一種分而治之思想在排序算法上的典型應用。本質上來看,快速排序應該算是在冒泡排序基礎上的遞歸分治法。

算法步驟:

快速排序使用分治法(Divide and conquer)策略來把一個序列(sequence)分為兩個子序列(Sub-sequence)。

首先從未排序序列中挑出一個元素(通常為了方便,都是用第一個元素),稱為 「基準」(pivot)。

然後以這個基準值將序列重新排序,比基準值小的擺放在基準的前面,比基準大的擺放在基準的後面(相同的數可以到任意一邊,這也就是說快速排序是不穩定排序),一輪結束之後該基準數也就歸位了。

通過上面步驟我們已經將序列分為兩個子序列,然後對左邊和右邊的子序列重複上述步驟,直到所有基準值全部歸位排序完成。

算法圖解:

Array = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]

如何將基準值歸位步驟圖解:(這裡用以3為基準的情況)

首先快速排序是冒泡排序的一種升級版,在前面我們介紹了冒泡排序是相鄰兩個元素進行比較,較大的元素向後移;很明顯這種方式是較為浪費時間的。
而快速排序是設置兩個指針(i,j)以及一個基準值,分別指向要排序序列的頭部(i)和尾部(j),從兩端開始進行對比,每次先通過 j 從右向左尋找小於基準值的元素,再通過 i 從左向右尋找大於基準值的元素,找到之後兩個值進行交換,然後繼續尋找,繼續交換;直到兩個指針相遇,將基準值和當前位置的值進行交換,結束本輪交換。

算法實現:

def quick_Sort(arr, left=None, right=None):
    left = 0 if not isinstance(left, (int, float)) else left
    right = len(arr) - 1 if not isinstance(right, (int, float)) else right
    if left < right:
        partitionIndex = partition(arr, left, right)
        quick_Sort(arr, left, partitionIndex - 1)
        quick_Sort(arr, partitionIndex + 1, right)
    return arr


def partition(arr, left, right):
    pivot = left
    index = pivot + 1
    i = index
    while i <= right:
        if arr[i] < arr[pivot]:
            swap(arr, i, index)
            index += 1
        i += 1
    swap(arr, pivot, index-1)
    return index - 1


def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]


Array = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]

print("排序完成,最終返回結果為:", quick_Sort(Array))

友情提示:可在 https://pythontutor.com/visualize.html#mode=edit 中可視化執行代碼。

關注公眾號,後續更精彩。

相關焦點

  • Python實現的快速排序
    第二個是對於數據結構設計上和算法的密切相關,讓我突然理解了資料庫中的設計方式。如果說原來是明白了5分,現在是打通了原來的一道壁壘,我能夠真正的接受那種設計方式。第三個是對於算法的設計,排除了我原來的一些盲點。
  • Python版快速排序算法
    收錄於話題 #算法分析與設計
  • 用python實現快速排序
    收錄於話題 #快速排序下面是快速排序的定義:快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
  • Python實現經典排序算法(四):快速排序
    快速排序(Quicksort)是對冒泡排序的一種改進。
  • Python 實現快速排序、冒泡排序和選擇排序
    作者|借我一生執拗https://www.jianshu.com/p/c150fd974ce8本節讓我們來介紹三種常用的排序算法
  • 用Python實現常見的四種排序算法
    排序是每個軟體工程師和開發人員都需要掌握的技能。不僅要通過編程面試,還要對程序本身有一個全面的理解。不同的排序算法很好地展示了算法設計上如何強烈的影響程序的複雜度、運行速度和效率。排序有很多種實現方法,比如冒泡排序、選擇排序、歸併排序、希爾排序、快速排序、插入排序、堆排序、基數排序等,今天就給大家介紹使用Python語言實現的其中4個排序算法。1. 快速排序首先要打亂序列順序 ,以防算法陷入最壞時間複雜度。快速排序使用「分而治之」的方法。
  • 10 大經典排序算法(Python 版)
    排序算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸併排序、快速排序、堆排序、基數排序等。
  • 排序算法:歸併排序
    在日常開發中經常會遇到一類問題,就是對一個集合的數據進行排序掌握一些排序算法,對於日常開發是非常有幫助今天介紹一下歸併排序法01算法邏輯02時間複雜度由上圖邏輯可以得出,歸併排序的循環次數為由算法導論的主定理可以推導出,可見之前的文章(文末有連結)歸併排序的時間複雜度為03空間複雜度由上圖邏輯可以得出,歸併排序每次分解都是要復一份新的數據片段
  • 用Python實現十大經典排序算法
    10種經典排序算法包括冒泡排序、選擇排序、快速排序、歸併排序、堆排序、插入排序、希爾排序、計數排序、桶排序、基數排序等。當然,還有一些其他的排序算法,大家可以繼續去研究下。01冒泡排序冒泡排序(Bubble Sort)是一種比較簡單的排序算法,它重複地走訪過要排序的元素,依次比較相鄰兩個元素,如果它們的順序錯誤就把他們調換過來,直到沒有元素再需要交換,排序完成。註:上圖中,數字表示的是數據序列原始的索引號。算法過程比較相鄰的元素,如果前一個比後一個大,就把它們兩個對調位置。
  • JavaScript算法之快速排序
    如果你在面試軟體工程師的職位,經常被問到的一個問題是快速排序是如何工作的。快速排序最簡單的邏輯步驟如下:選擇一個基準元素,把數組分為兩個子數組。有些算法選擇第一個元素為基準,這樣不是最佳選擇,因為對於已排序的數組來說這樣做的性能是最差的。
  • JavaScript實現排序算法
    所以說算法A比算法B快兩倍,這樣的比較是沒有意義的。因此我們通常使用算法的速度隨著數據量的變化會如何變化的方式來表示算法的效率,大O表示法就是方式之一。希爾排序的歷史背景:希爾排序按其設計者希爾(Donald Shell)的名字命名,該算法由1959年公布;希爾算法首次突破了計算機界一直認為的算法的時間複雜度都是
  • 為什麼要排序?排序算法的性能提升之道
    那麼,如何實現排序呢?這些排序算法,你應該了解。冒泡排序這是最簡單的排序算法。只需比較每對相鄰的元素,並檢查元素是否有序,否則交換兩個元素,直到所有元素都被排序為止。如果遍歷整個數組時沒有交換,則該數組已完全排序,因此可以跳出循環。這大大降低了算法的時間複雜度。
  • 音視頻開發之旅(24) 算法系列-快速排序
    @"fx(2)=6\r\n"因為下面要講的快速排序算法以及堆排序算法都會用到遞歸調用下面我們開始快速排序算法的學習。二、快速排序快速排序和冒泡排序一樣都屬於交換排序,不同在於,快速排序不是通過兩兩相鄰比較每一輪只把一個元素冒泡到頂端,而是引入了基準元素的概念,每一輪挑選一個基準元素(一般把第數組的第一個作為基準元素),讓比它大的元素移動到一端,比它小的元素移動到另外一端。然後在不斷的遞歸調用,從而實現快速排序。
  • 排序算法之高效排序法
    高效排序算法桶排序桶排序 (Bucket sort)或所謂的箱排序,是一個排序算法,工作的原理是將數組分到有限數量的桶子裡。每個桶子再個別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排序)。桶排序原理介紹桶排序是計數排序的升級版。它利用了函數的映射關係,高效與否的關鍵就在於這個映射函數的確定。
  • 經典排序算法五 堆排序(JAVA實現)
    堆排序基本原理堆排序是利用堆這種數據結構而設計的一種排序算法,堆排序是一種選擇排序。首先我們來了解下什麼是堆。堆分為兩種:大頂堆和小頂堆,兩者的差別主要在於排序方式。堆是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆。
  • Python,Numpy,Pandas……數據科學家必備排序技巧
    Python會提供許多內置庫,優化排序選項。有些庫甚至可以同時在GPU上運行。令人驚奇的是,一些排序方法並沒有使用之前所述的算法類型,其他方法的執行效果也不如預期。選擇使用哪種庫和哪類排序算法著實難辦,因為算法的執行變化很快。本文將具體展開講解,提供一些幫助記憶算法的技巧,分享測速的結果。分好類的茶開始排序吧!
  • 快速排序
    快速排序(Quicksort),一種排序算法,最早由東尼·霍爾提出。
  • 八大排序算法時間空間複雜度分析
    4、快速排序的時間複雜度最好是O(nlogn),平均也是O(nlogn),最壞情況是序列本來就是有序的,此時時間複雜度為O(n²),快速排序的空間複雜度可以理解為遞歸的深度,而遞歸的實現依靠棧,平均需要遞歸logn次,所以平均空間複雜度為O(logn)。
  • 力扣(LeetCode)- 常見的排序算法總結
    如何分析一個排序算法好壞時間複雜度、比較和交換次數、原地排序(空間複雜度為(1))、排序穩定性(相等元素之間的位置先後順序不變)。有序度:是數組中具有有序關係的元素對的個數逆序度:和有序度相反。選擇排序是不穩定排序,所以應用最少。
  • Java實現冒泡排序算法
    >2.考考你在上一篇:數據結構與算法系列十(排序概述)中,我們列舉了常用的排序算法,以及分析了如何綜合衡量排序算法的優劣。從這一篇開始,我們把每一種排序算法,從算法的思想,到代碼實現都做一個分享。那麼你準備好了嗎?我們這一篇的主角是:冒泡排序#考考你:1.你知道冒泡排序的核心思想嗎?