Python的快排應有的樣子
阿新 • • 發佈:2018-06-15
for 第一個 歸並排序 復雜 asc acm 一個 CM nic
快排算法
? 簡單來說就是定一個位置然後,然後把比它小的數放左邊,比他大的數放右邊,這顯然是一個遞歸的定義,根據這個思路很容易可以寫出快排的代碼
? 快排是我學ACM路上第一個讓我記住的代碼,印象很深刻,以前學的是Pascal,寫這個要寫好長一串,但是因為和歸並排序比起來還算短的,也就背下來了。好奇的我點開百科看python的快排代碼,就看到了如下代碼:
#quick sort
def quickSort(L, low, high):
i = low
j = high
if i >= j:
return L
key = L[i]
while i < j:
while i < j and L[j] >= key:
j = j-1
L[i] = L[j]
while i < j and L[i] <= key:
i = i+1
L[j] = L[i]
L[i] = key
quickSort(L, low, i-1)
quickSort(L, j+1 , high)
return L
看完上面的代碼後心情復雜,這完全就是我一開始學Pascal的那種代碼,只是換成了python的語法來實現,這怎麽能體現出python的獨特之處呢_(:з」∠)_
這樣的代碼真的是一點都不Pythonic,真正符合Pythonic的快排代碼應該是如下這樣的
def quicksort(array):
if len(array) < 2:
return array #如果數組的長度為0或1當然直接返回了
else:
pivot = array[0]
less = [i for i in array[1:] if i <= pivot]
greater = [i for i in array[1:] if i >pivot]
return quicksort(less) + [pivot] + quicksort(greater)
這樣才是優雅的Python啊(′▽`)?
ps.如需轉載,請註明出處
喜歡請支持下~
Python的快排應有的樣子