python 高階排序 二

2021-08-22 19:30:01 字數 3018 閱讀 9858

快速排序名字可不是蓋的,很多程式語言標準庫實現的內建排序都要它的身影, 我們就直奔主題吧。和歸併排序一樣,快排也是一種分而治之(divide

and

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)

是不是很簡單,下次面試官讓你手寫快排你再寫不出來就有點不太合適啦。當然這個實現也有兩個不好的地方:

1.第一是它需要額外的儲存空間,我們想實現inplace原地排序

2.第二是它的partition操作每次都要兩次遍歷整個陣列,我們想改善一下

這裡我們來優化一下它,實現inplace排序並且改善下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 呼叫...