快速排序名字可不是蓋的,很多程式語言標準庫實現的內建排序都要它的身影, 我們就直奔主題吧。和歸併排序一樣,快排也是一種分而治之(divideand
conquer)的策略。歸併排序把陣列遞迴成只有單個元素的陣列,之後再不斷兩兩合併,最後得到乙個有序的陣列。這裡的遞迴基本條件就是只包含乙個元素的陣列,當陣列只包含乙個元素的時候,我們可以認為它本來就是有序的(當然空陣列也不用排序).
快排的工作過程其實比較簡單,三步走:1.選擇基準值 pivot 將陣列分成兩個子陣列:小於基準值的元素和大於基準值的元素。這個過程稱之為 partition
2.對這兩個子陣列進行快速排序
3.合併結果
根據這個想法我們可以快速寫出快排的**,簡直就是在翻譯上邊的描述:
# -*- coding:utf-8 -*-
defquicksort
(array):
if len(array) < 2:
return array
else:
pivot_index = 0
pivot = array[pivot_index]
#構造乙個小於基準值的元素陣列
less_port = [i for i in array[pivot_index+1:] if i <= pivot]
#構造乙個大於基準值的元素陣列
great_sort = [i for i in array[pivot_index+1:] if i > pivot]
return quicksort(less_port) + [pivot] + quicksort(great_sort)
deftest_quicksort
():import random
seq = list(range(10))
random.shuffle(seq)
assert quicksort(seq) == sorted(seq)
是不是很簡單,下次面試官讓你手寫快排你再寫不出來就有點不太合適啦。當然這個實現也有兩個不好的地方:這裡我們來優化一下它,實現inplace排序並且改善下partition操作.1.第一是它需要額外的儲存空間,我們想實現inplace原地排序
2.第二是它的partition操作每次都要兩次遍歷整個陣列,我們想改善一下
''' 方法實現:
第乙個元素作為 pivot主元,
將比主元值小的元素放在主元左邊
將比主元值大的元素放在主元右邊
'''def
partition
(array,beg,end):
pivot_index = beg
pivot = array[pivot_index]
left = pivot_index + 1
right = end - 1
while
true:
while left <= right and array[left] < pivot:
left += 1
while right >= left and array[right] >= pivot:
right -= 1
if left > right:
break
else:
array[left],array[right] = array[right],array[left]
array[pivot_index],array[right] = array[right],array[pivot_index]
return right
deftest_partition
(): l = [4,1,2,8]
assert partition(l,0,len(l)) == 2
l = [1,2,3,4]
assert partition(l,0,len(l)) == 0
l = [4,3,2,1]
assert partition(l,0,len(l)) == 3
defquicksort_inplace
(array,beg,end):
if beg < end:
pivot = partition(array,beg,end)
quicksort_inplace(array,beg,pivot)
quicksort_inplace(array,pivot+1,end)
deftest_quicksort_inplace
():import random
seq = list(range(10))
random.shuffle(seq)
print(seq)
quicksort_inplace(seq,0,len(seq))
print(seq)
python 高階函式(二)
python中用關鍵字lambda表示匿名函式,匿名函式只有一條語句,很簡潔也沒有函式名 lambda 引數 返回值 lambda可以不傳引數,但必須要有返回值 f lambda x,y x y f 1,2 3 def f x,y return x y 以上兩個函式是等價的 裝飾器從字面上來說就是在...
Python基礎高階(二)
1 類與物件 物件是類的例項。換句話說,類主要定義物件的結構,然後我們以類為模板建立物件。類不但包含方法定義,而且還包含所有例項共享的資料。我們可以使用關鍵字class定義 python 類,關鍵字後面緊跟類的名稱 分號和類的實現。class turtle python中的類名約定以大寫字母開頭 關...
二 Python 高階 之 模組
越來越多的時候 將所有 放入同乙個 py 檔案 無法維護。如果將 拆分放入到多個 py 檔案,好處有 同乙個名字的變數互不影響 模組的名字就是 py 檔案的檔名 應用其他的模組 test.py 自身的模組名 import math 引用的 math 模組 print math.pow 2,10 呼叫...