快速排序:用Python實現簡單高效的數組排序

快速排序是一種常用的排序演算法之一,也是一種高效的排序方法,尤其擅長對大規模數據集排序。

一、演算法原理

快速排序的基本思路是:選擇一個基準元素,將數組分為兩個子數組,小於基準的位於左子數組,大於基準的位於右子數組,然後遞歸地對左右子數組進行排序,最後合併兩個子數組。

具體的實現方法有很多,我們舉一個例子:

<pre>
def quick_sort(array):
    if len(array) <= 1:
        return array
    else:
        #選取基準元素
        pivot = array[0]
        #將小於基準的元素放到左邊,大於基準的元素放到右邊
        left = [x for x in array[1:] if x < pivot]
        right = [x for x in array[1:] if x >= pivot]
        #遞歸排序左右子數組
        return quick_sort(left) + [pivot] + quick_sort(right)
</pre>

二、演算法優化

快速排序的平均時間複雜度為O(nlogn),是一種非常高效的排序演算法。不過,在實際應用中,快排也有一些局限性:

1、如果已經排好序的數組會使遞歸樹的深度達到O(n),時間複雜度變為O(n^2)。這種情況下,可以隨機選取基準元素來避免。

2、在業務上,如果數組中有大量重複的元素,快排的效率會大大降低。這種情況下,可以選擇三路快排演算法。

我們來看看如何優化快速排序演算法:

1、隨機選取基準元素

可以通過random模塊來隨機選取基準元素,代碼如下:

<pre>
import random

def quick_sort(array):
    if len(array) <= 1:
        return array
    else:
        #隨機選取基準元素
        index = random.randint(0, len(array) - 1)
        pivot = array[index]
        #將小於基準的元素放到左邊,大於基準的元素放到右邊
        left = [x for x in array[:index] + array[index+1:] if x < pivot]
        right = [x for x in array[:index] + array[index+1:] if x >= pivot]
        #遞歸排序左右子數組
        return quick_sort(left) + [pivot] + quick_sort(right)
</pre>

2、三路快排

三路快排演算法是對快速排序演算法的一種優化,主要應用於處理有大量重複元素的數組。它不但能減少遞歸深度,也能減少時間複雜度。

思路是將數組分為小於、等於、大於基準元素的三個區間,然後遞歸對小於和大於的部分繼續進行三路快排,以此類推。

<pre>
def quick_sort_3w(array):
    if len(array) <= 1:
        return array
    else:
        #選取基準元素
        pivot = array[0]
        lt = [x for x in array if x < pivot] #小於基準元素的數組
        eq = [x for x in array if x == pivot] #等於基準元素的數組
        gt = [x for x in array if x > pivot] #大於基準元素的數組
        #遞歸排序三個子數組
        return quick_sort_3w(lt) + eq + quick_sort_3w(gt)
</pre>

三、演算法實現

現在,我們可以來實現一個完整的快速排序演算法,在實現過程中可以選擇以上兩種優化演算法。

<pre>
import random

def quick_sort(array):
    if len(array) <= 1:
        return array
    else:
        #隨機選取基準元素
        index = random.randint(0, len(array) - 1)
        pivot = array[index]
        #將小於基準的元素放到左邊,大於基準的元素放到右邊
        left = [x for x in array[:index] + array[index+1:] if x < pivot]
        right = [x for x in array[:index] + array[index+1:] if x >= pivot]
        #遞歸排序左右子數組
        return quick_sort(left) + [pivot] + quick_sort(right)

def quick_sort_3w(array):
    if len(array) <= 1:
        return array
    else:
        #選取基準元素
        pivot = array[0]
        lt = [x for x in array if x < pivot] #小於基準元素的數組
        eq = [x for x in array if x == pivot] #等於基準元素的數組
        gt = [x for x in array if x > pivot] #大於基準元素的數組
        #遞歸排序三個子數組
        return quick_sort_3w(lt) + eq + quick_sort_3w(gt)
</pre>

四、總結

快速排序是一種常用的高效排序演算法,一般情況下優於冒泡排序、插入排序、選擇排序等演算法。

快速排序的基本思路是分治法,通過遞歸將數組分為兩個子數組進行排序,最後合併。

如果數組中有大量重複元素,可以採用三路快排演算法進行優化。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/185957.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-26 21:08
下一篇 2024-11-26 21:08

相關推薦

  • Ojlat:一款快速開發Web應用程序的框架

    Ojlat是一款用於快速開發Web應用程序的框架。它的主要特點是高效、易用、可擴展且功能齊全。通過Ojlat,開發人員可以輕鬆地構建出高質量的Web應用程序。本文將從多個方面對Oj…

    編程 2025-04-29
  • Python導入數組

    本文將為您詳細闡述Python導入數組的方法、優勢、適用場景等方面,並附上代碼示例。 一、numpy庫的使用 numpy是Python中一個強大的數學庫,其中提供了非常豐富的數學函…

    編程 2025-04-29
  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python返回數組:一次性搞定多種數據類型

    Python是一種多用途的高級編程語言,具有高效性和易讀性的特點,因此被廣泛應用於數據科學、機器學習、Web開發、遊戲開發等各個領域。其中,Python返回數組也是一項非常強大的功…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python去掉數組的中括弧

    在Python中,被中括弧包裹的數據結構是列表,列表是Python中非常常見的數據類型之一。但是,有些時候我們需要將列表展開成一維的數組,並且去掉中括弧。本文將為大家詳細介紹如何用…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • Python二維數組對齊輸出

    本文將從多個方面詳細闡述Python二維數組對齊輸出的方法與技巧。 一、格式化輸出 Python中提供了格式化輸出的方法,可以對輸出的字元串進行格式化處理。 names = [‘A…

    編程 2025-04-29
  • 二階快速求逆矩陣

    快速求逆矩陣是數學中的一個重要問題,特別是對於線性代數中的矩陣求逆運算,如果使用普通的求逆矩陣方法,時間複雜度為O(n^3),計算量非常大。因此,在實際應用中需要使用更高效的演算法。…

    編程 2025-04-28

發表回復

登錄後才能評論