1. 程式人生 > 實用技巧 >演算法學習:快速排序

演算法學習:快速排序

1、基本思想

取待排序陣列第一個數作為參照數,建立left和right陣列,left儲存小於參照數的陣列集合,right儲存大於參照數的陣列集合,然後分別對left和right進行遞迴呼叫排序。 2、舉例
[11,2,3,43,23,5,6,9,10]
取任意的一個數為基準數
temp = arr[0]
遍歷陣列,將比temp小的元素放在temp的左邊,比temp大的元素放在temp的右邊
left+【temp】+right
然後對左邊和右邊的元素分別進行quicksort
[3,21,1,999,9,2,2]
temp =3 
left = [1]
right = [21]

[1,3,21]

3、實現步驟

先從數列中取出一個數作為基準數
分割槽過程,將比這個數大的數全放到它的右邊
將小於或等於它的數全放到它的左邊
再對左右區間重複第二步,直到各區間只有一個數

4、實現方法1

def quickSort(start_idx,end_idx,arr): 
    """start_idx和end_idx確定排序區間""" 
    if start_idx>=end_idx:
        return arr
    low,high = start_idx,end_idx#設定2個指標分別執行待排序陣列的起始和結束位置 
    temp=arr[low]#設定基準數temp = arr[low]
while low<high: while low< high and arr[high]>=temp:#從隊尾向前掃描,如果隊尾的數小於temp將隊尾的數放在low的位置 high-=1 arr[low] = arr[high] while low<high and arr[low]<temp:#從隊首向後掃描,如果隊首的數大於temp將隊首的數放在high的位置 low+=1 arr[high] = arr[low] arr[low]
= temp quickSort(start_idx,low,arr) quickSort(low+1,end_idx,arr) return arr

5、實現方法2

def quickSort02(arr):
    if not arr:
        return arr
    temp = arr[0]
    left = [x for x in arr[1:] if x<=temp]
    right= [x for x in arr[1:] if x>temp]
    return quickSort02(left)+[temp]+quickSort02(right)


print(quickSort02([1,45,23,28,33,22,1,-1])) #結果 [-1, 1, 1, 22, 23, 28, 33, 45]

6、快速排序的時間複雜度和空間複雜度

•時間複雜度:為O(nlogn) • 空間複雜度:快速排序使用遞迴,遞迴使用棧,因此它的空間複雜度為O(logn) • 穩定性:快速排序無法保證相等的元素的相對位置不變,因此它是不穩定的排序演算法