執行過程中,i 之前(含)的元素都比 a[r] 小,之後的比 a[r] 大。即 p ~ i 的元素比 a[r] 小,其後a[i+1] ~ a[j-1] 的元素比a[r]大。最後,交換a[i+1]與a[r]。
def quicksort(a, p, r):
if p < r:
q = partition(a, p, r)
quicksort(a, p, q-1)
quicksort(a, q+1, r)
def partition(a, p, r):
x = a[r]
i = p-1
for j in range(p, r):
if a[j] <= x:
i += 1
a[i], a[j] = a[j], a[i]
a[i+1], a[r] = a[r], a[i+1]
return i+1
def main():
a = [2, 8, 7, 1, 3, 5, 6, 4]
quicksort(a, 0, len(a)-1)
print(a)
if __name__=='__main__':
main()
結果如下:import numpy as np
import time
def randomizedquicksort(a, p, r):
if p < r:
q = randomizedpartition(a, p, r)
randomizedquicksort(a, p, q-1)
randomizedquicksort(a, q+1, r)
def partition(a, p, r):
x = a[r]
i = p-1
for j in range(p, r):
if a[j] <= x:
i += 1
a[i], a[j] = a[j], a[i]
a[i+1], a[r] = a[r], a[i+1]
return i+1
def randomizedpartition(a, p, r):
import random
i = random.randint(p, r) # 隨機選取乙個元素作為主元
a[i], a[r] = a[r], a[i]
return partition(a, p, r)
def main():
a = np.random.randint(low=0, high=1000, size=1000) # 隨機生成1000個0到1000之間的整數並存到列表中
a = list(a)
before = time.time()
randomizedquicksort(a, 0, len(a)-1)
after = time.time()
operation_time = after - before # 計算執行時間
# 快速排序時間複雜度為o(n*logn)
if __name__=='__main__':
main()
輸出為第4小的數:4from randomized_quicksort import randomizedpartition
def randomizedselect(a, p, r, i):
if p == r:
return a[p]
q = randomizedpartition(a, p, r) # 將陣列劃分為兩個子陣列a[p..q-1]和a[q+1..r]
k = q-p+1 # 計算子陣列a[p..q]內的元素個數k
if i == k:
return a[q]
elif i < k:
return randomizedselect(a, p, q-1, i)
else:
return randomizedselect(a, q+1, r, i-k)
def main():
a = [2, 8, 7, 1, 3, 5, 6, 4]
print(randomizedselect(a, 0, len(a)-1, 4))
if __name__=='__main__':
main()
快速排序的實現(python)
usr bin env python3 coding utf 8 import random 快速排序基礎 defpartition a,p,r x a r i p 1 j p while j r if a j x i 1 temp a i a i a j a j temp j 1 i 1 temp...
python 快速排序的實現
快速排序 quicksort 是對氣泡排序的一種改進。快速排序演算法通過多次比較和交換來實現排序,其排序流程如下 def quick sort origin items,comp lambda x,y x y items origin items quick sort items,0,len ite...
快速排序的Python實現
任意選乙個資料作為基準資料,然後將所有比它小的數都放到它的左邊,所有比它大的數都放到它的右邊 這裡以乙個列表作為例子 45,34,12,56,87,77,47,23 首先選擇45為基準資料 比45小的有 34,12,23 比45大的有 87,77,47,56 所以第一次排序就是 34,12,23,4...