8行程式碼實現快速排序,簡單易懂圖解!

Yang`發表於2022-06-30

快速排序是一種常用的排序演算法,比選擇排序快的多。在之前的我隨筆中也寫過關於快速排序的演算法,也可以看一下和現在的區別python實現快速排序 - Mr-Yang` - 部落格園 (cnblogs.com)

在看快速排序之前,要先了解一下遞迴,對於遞迴我之前的文章中也有提到python遞迴函式 - Mr-Yang` - 部落格園 (cnblogs.com),在這裡我補充一個關於遞迴的一個點:基線條件和遞迴條件

一、基線條件和遞迴條件

由於遞迴函式是自己呼叫自己,因此編寫這樣的函式時容易出錯,從而導致無限迴圈。示例如下:

def countdown(i):
    print(i)
    countdown(i-1)

如果執行上述程式碼,就會發現一個問題:這個函式執行起來是不會停止,直到到達遞迴的最大深度。

正是因為這樣,編寫遞迴函式的時候,必須告訴它何時停止遞迴,所以每個遞迴函式都有兩個部分:基線條件(base case)和遞迴條件(recursive case)。遞迴條件指定的是函式呼叫自己,而基線條件則指的是不再呼叫自己,從而避免迴圈。例如給 countdown 新增基線條件。

def countdown(i):
    print(i)
   	if i <= 1:	#<----------基線條件
        return
    else:	#<--------------遞迴條件
        countdown(i-1)

這樣就按照預期那樣執行,不會無限迴圈下去如圖所示

遞迴函式

二、快速排序

因為對於排序來說,最簡單的就是一個空列表,或者只包含一個元素的列表,所以可以將基線條件設定為空或只包含一個元素,在這種情況下,只需要返回原列表。

def quicksort(alist):
    if len(alist) < 2:
        return alist

思路如下圖所示:

快速排序思路

程式碼如下:

def quicksort(alist):
    if len(alist) < 2:
        return alist	# 基線條件為空或只包含一個元素的列表是有序的。
    else:
        pivot = alist[0]	# 選擇基準值
        less = [i for i in alist[1:] if i <= pivot]	# 由小於基準值的元素組成
        biggish = [i for i in alist[1:] if i > pivot]	# 由大於基準值的元素組成
        return quicksort(less) + [pivot] + quicksort(biggish)

相關文章