快速排序總結,Python版

2021-09-01 05:56:54 字數 4521 閱讀 9055

快速排序是面試最常考內容,

讓你描述演算法,

讓你寫演算法,

讓你分析時間複雜度

#快速排序整理

'''九章演算法令狐沖老師排序思路:

先取到中心index對應的陣列值

迴圈從左邊找到第乙個比中間值大的數字

迴圈從右邊找到第乙個比中間值小的數字

然後交換這兩個數字

最後分別對左右兩個部分重複以上思路

'''def quicksort(arr):

if not arr:

return

return qsort(arr, 0, len(arr)- 1)

def qsort(arr, start, end):

if start >= end:

return

left, right = start, end #start和end固定,以後只需要不停改變left和right的值就行了

#注意1:拿到中間指標對應的陣列值,而不是拿到中間指標的值

pivot = arr[(left + right)//2]

#注意2: left <= right 而不是 left < right

while left <= right:

#注意3:arr[left] < pivot 而不是

while left <= right and arr[left] < pivot:

left += 1

while left <= right and arr[right] > pivot:

right -= 1

if left <= right:

arr[left], arr[right] = arr[right], arr[left] #交換left和right對應的值

left += 1

right -= 1

print('left and right is :',left, right)

#注意4:經過上面的交換,這裡關係變為了right < left

qsort(arr, start, right)

qsort(arr, left, end)

#return arr

a = [9,3,8,5]

b = quicksort(a)

print("sequence is:", b)

輸出left and right is : 1 0

left and right is : 3 1

sequence is: [3, 5, 8, 9]

[finished in 0.0s]

'''複雜度分析:

當第一刀剛好切在左邊,剛好導致左邊只有乙個數字,其他數字全部在右邊,這種情況複雜度最差達到n的平方

當第一刀切在中間,並且左右兩側均勻分布,這種情況最優,複雜度達到nlogn

'''這道題有四個注意點,要不然很容易出錯。

網頁測試**

class solution:

# @param a an integer array

# @return nothing

def sortintegers2(self, a):

# write your code here

self.quicksort(a, 0, len(a) - 1)

def quicksort(self, a, start, end):

if start >= end:

return

left, right = start, end #start和end固定,以後只需要不停改變left和right的值就行了

#注意1:拿到中間指標對應的陣列值,而不是拿到中間指標的值

# key point 1: pivot is the value, not the index

pivot = a[(start + end) // 2];

#注意2: left <= right 而不是 left < right

# key point 2: every time you compare left & right, it should be

# left <= right not left < right

while left <= right:

#注意3:a[left] < pivot 而不是<=

while left <= right and a[left] < pivot:

left += 1

while left <= right and a[right] > pivot:

right -= 1

if left <= right:

a[left], a[right] = a[right], a[left]

left += 1

right -= 1

#注意4:經過上面的交換,這裡關係變為了right < left

self.quicksort(a, start, right)

self.quicksort(a, left, end)

通過了

快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要ο(n log n)次比較。在最壞狀況下則需要ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他ο(n log n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來。

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。

演算法步驟:

1 從數列中挑出乙個元素,稱為 "基準"(pivot),

2 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

3 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。

1)n大時好,快速排序比較占用記憶體,記憶體隨n的增大而增大,但卻是效率高不穩定的排序演算法。

(2)劃分之後一邊是乙個,一邊是n-1個,這種極端情況的時間複雜度就是o(n2)

(3)最好的情況是每次都能均勻的劃分序列,o(nlog2n)

(4)快速排序空間複雜度只是在通常情況下才為o(log2n),如果是最壞情況的話,很顯然就要o(n)的空間了。當然,可以通過隨機化選擇pivot來將空間複雜度降低到o(log2n)。

下面還是別人的

'''

六、快速排序 quicksort

介紹:快速排序通常明顯比同為ο(n log n)的其他演算法更快,因此常被採用,而且快排採用了分治法的思想,所以在很多筆試面試中能經常看到快排的影子。可見掌握快排的重要性。

步驟:1.從數列中挑出乙個元素作為基準數。

2.分割槽過程,將比基準數大的放到右邊,小於或等於它的數都放到左邊。

3.再對左右區間遞迴執行第二步,直至各區間只有乙個數。

'''

def quick_sort(ary):

return qsort(ary,0,len(ary)-1)

def qsort(ary,left,right):

#快排函式,ary為待排序陣列,left為待排序的左邊界,right為右邊界

if left >= right : return ary

key = ary[left] #取最左邊的為基準數

lp = left #左指標

rp = right #右指標

while lp < rp :

while ary[rp] >= key and lp < rp :

rp -= 1

while ary[lp] <= key and lp < rp :

lp += 1

ary[lp],ary[rp] = ary[rp],ary[lp]

ary[left],ary[lp] = ary[lp],ary[left]

qsort(ary,left,lp-1)

qsort(ary,rp+1,right)

return ary

a = [9,3,8,5]

b = quick_sort(a)

print("sequence is:", b)

---------------------

原文:

認識你是我們的緣分,同學,等等,學習人工智慧,記得關注我。

《灣區人工智慧》

快速排序 堆排序 歸併排序總結(C 版)

區間內只剩乙個 沒有數時,結束遞迴 找區間左端當作參考值ref進行劃分partition,並得到ref應該在的index 劃分後index左邊的都比ref小,右邊的都比ref大 對index左右遞迴的進行快速排序 include include using namespace std void qu...

python快速排序排序 python快速排序

import random def rand n for i in range n yield random.randint 0,1000 建立乙個隨機數列表 def createlist n lists for i in rand n return lists 挖坑法快速排序 def quick ...

golang 版快速排序

快速排序作為經典演算法,基本面試中都會遇到,今天記錄一下。1.非遞迴版,這裡也是使用乙個棧的模型 自己實現 來實現。需要注意的是inte ce轉int需要斷言。package main import container list fmt stack is stack type stack struc...