快速排序
快速排序是一種基於分治法(Divide and Conquer)的排序算法 它之所以稱為快速排序是因為它的平均時間復雜度為O(nlogn),最壞情況下是O(n2) 但是這樣的情況不常見 一般需要每次划分的左右兩邊元素個數為1個和n-1個 比如已排好序的數組。大部分的情況都會是大致均勻划分的情況。
原理講解
基於分治法,快速排序操作步驟如下:
1. 選擇一個基准值(pivot) 在這里 我選擇列表第一個元素作為基准值
2.將數組中比pivot小於或者等於的元素交換到pivot前面;將比pivot大於的元素交換到pivot后面
3.將已經分好的兩個左右子列表 重復2操作
Python實現
1 def getIndex(arr, l, r): 2 tmp = arr[l] #10 3 while (l < r): 4 while (l<r and tmp < arr[r]): 5 r -= 1 6 arr[l] = arr[r] 7 while (l<r and tmp >= arr[l]): 8 l += 1 9 arr[r] = arr[l] 10 arr[l] = tmp 11 return l 12 13 def QuickSort(arr, l, r): 14 if l<r: 15 index = getIndex(arr, l, r) 16 QuickSort(arr, l, index-1) 17 QuickSort(arr, index+1, r) 18 19 if __name__ == '__main__': 20 Arr = [10, 20, 30, 40 ,50] 21 QuickSort(Arr, 0, len(Arr)-1) 22 print(Arr)
時間、空間復雜度;穩定性分析
時間復雜度:平均時間復雜度為O(nlogn); 最好O(nlogn) 最差O(n*n). 最理想的情況就是每次折半時都能夠分成均勻的兩半。最差的情況是每次折半只確定一個元素的位置結果就是要分n次
空間復雜度:代碼沒有顯示開辟新內存 所以O(1) 但是在遞歸過程中會在后台利用隊棧空間存儲遞歸過程中的臨時變量 分治的時候用到了遞歸 所以平均為O(1*logn). 最差是O(n)
穩定性:快速排序為不穩定排序 在交換元素過程中相同元素順序會發生改變。例如:列表[3,4,5,3,2], 兩個3的順序就會在交換過程發生改變
總結
剛剛寫技術博客 每一次寫都比預算要的時間要長 而且博客的質量也很一般 但是 無論再精致的博客 也是從開始一篇篇累積一點點成長 到最后寫一篇技術博客 用時固定 而且質量高。我唯一要做的就是堅持下去不間斷。加油!