快速排序是面試最常考內容,
讓你描述演算法,
讓你寫演算法,
讓你分析時間複雜度
#快速排序整理
'''九章演算法令狐沖老師排序思路:
先取到中心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...