演算法導論 中的快速排序與隨機指示器優化後的快速排序

2021-08-28 15:19:58 字數 1771 閱讀 4464

快速排序的基本思想是找到某個主元的固定位置(也就是下標),小於主元的元素放左邊,大於主元的放右邊,然後遞迴求左邊和右邊主元的位置

常規版本

快速排序的最壞情況是θ(n^2) 數學期執行時間為θ(nlgn),實際上是大多數情況

#快速排序演算法主函式,實現對a[q]的定位

#a為陣列名,p是第乙個索引,q是最後乙個索引 p=0 q=len(a)-1

def partition(a,p,q):

x = a[q]

i = p-1

#for迴圈從索引從p到q-1的值和x比較

for j in range(p,q):

# 比a[q] 小的數字 都放在左邊集中到一起

if a[j]<=x:

#按順序找到第乙個比a[q]小的元素就和a[i]換位置找到一次,i自加一次

i= i+1

a[i],a[j] = a[j],a[i]

#定位a[q]的位置即在原來a[i+1]的位置上,因為a[i]是小於a[q]的

a[i+1],a[q] = a[q],a[i+1]

#返回值為最右邊數的確定位置

return i+1

#快速排序函式

def quicksort(a,p,q):

if p優化版本

#由於快速排序在最壞情況(已排序好)下的時間複雜度是deta(n^2),而平均情況和最好情況複雜度是deta(n*logn),

# 隨意採用隨機主元可以使演算法是執行時間提高而盡可能消除最壞情況

import random

#a為陣列名,p是第乙個索引,q是最後乙個索引 p=0 q=len(a)-1

def partition(a,p,q):

x = a[q]

i = p-1

#for迴圈從索引從p到q-1的值和x比較

for j in range(p,q):

# 比a[q] 小的數字 都放在左邊集中到一起

if a[j]<=x:

#按順序找到第乙個比a[q]小的元素就和a[i]換位置找到一次,i自加一次

i= i+1

a[i],a[j] = a[j],a[i]

#定位a[q]的位置即在原來a[i+1]的位置上,因為a[i]是小於a[q]的

a[i+1],a[q] = a[q],a[i+1]

#返回值為最右邊數的確定位置

return i+1

#隨機化快速排序基礎函式:

def randomozed_partition(a,p,q):

#在p和q中隨機產生乙個整數主元i

i = random.randint(p,q)

#交換a[i] 和 a[q]的值 使陣列隨機而不是已經排序好

a[i],a[q] = a[q],a[i]

return partition(a,p,q)

def randomized_quicksort(a,p,q):

if pr = randomozed_partition(a,p,q)

#遞迴排序主元r 左邊和右邊的陣列

randomized_quicksort(a,p,r-1)

randomized_quicksort(a,r+1,q)

return a

a = input("請輸入").split()

for i in range(len(a)):

a[i] = int(a[i])

print(randomized_quicksort(a,0,len(a)-1))

演算法導論 4 隨機快速排序與線性時間排序

這一篇主要是關於快速排序的隨機化版本和線性時間排序。前者即跟遞迴有關,又跟隨機演算法和概率分布有關,與後者合併作為一篇。主要記錄一些演算法的實現,和部分題目的思路。快速排序效能的好壞和partition過程中陣列最後乙個值 主元 密切相關,事實上我們希望待排序陣列的任意乙個排列都是等可能出現,從而使...

演算法導論 隨機化的快速排序

public void random quicksort int array,int left,int right public int random position int array,int left,int right param array 待排序的陣列 param left 左邊界 pa...

經典快速排序演算法與隨機快速排序演算法

快速排序用到了分治思想,同樣的還有歸併排序。乍看起來快速排序和歸併排序非常相似,都是將問題變小,先排序子串,最後合併。不同的是快速排序在劃分子問題的時候經過多一步處理,將劃分的兩組資料劃分為一大一小,這樣在最後合併的時候就不必像歸併排序那樣再進行比較。但也正因為如此,劃分的不定性使得快速排序的時間複...