算法學習:快速排序
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)
? 穩定性:快速排序無法保證相等的元素的相對位置不變,因此它是不穩定的排序算法
浙公網安備 33010602011771號