快速排序 總結與改進

2021-07-29 09:53:36 字數 2548 閱讀 2053

之前的幾次面試都有問到快速排序,我的寫法都是按照演算法導論上隨便寫寫的:

#快速排序

defquicksort

(nums,p,r):

if p1)

quicksort(nums,q+1,r)

return

defpartition

(nums,p,r):

x=nums[r]

i=p-1

#記錄位置

for j in range(p,r):

if nums[j]<=x:

i+=1

nums[i],nums[j]=nums[j],nums[i]

nums[i+1], nums[r] = nums[r], nums[i+1]

return i+1

def

quicksort2

(nums,p,r):

#非遞迴實現,只需要申請乙個 棧來記錄 需要排序的起始位置與終點位置

stack=[p,r]

while stack:

new_r=stack.pop()

new_p=stack.pop()

q=partition(nums,new_p,new_r)

if new_p1:

stack.extend([new_p,q-1])

if new_r>q+1:

stack.extend([q+1,new_r])

return nums

def

quicksort

(nums,p,r):

if p>=r:return

x=nums[r]

i=p-1

#記錄位置

for j in range(p,r):

if nums[j]<=x:

i+=1

nums[i],nums[j]=nums[j],nums[i]

nums[i+1], nums[r] = nums[r], nums[i+1]

q=i+1

quicksort(nums,p,q-1)

quicksort(nums,q+1,r)

return

def

quicksort

(nums,p,r):

if p>=r:return

x=nums[p]

i=p #記錄位置

for j in range(p+1,r+1):

if nums[j]1

nums[i],nums[j]=nums[j],nums[i]

#最後的結果:nums[p+1,,,,i-1]都小於x;nums[i,...,r]>=x

nums[i], nums[p] = nums[p], nums[i]

quicksort(nums,p,i-1)

quicksort(nums,i+1,r)

return

考慮極端的情況:如果n個數都相同,插入排序是o(n),而快排則變成了平方級別的。

考慮從兩端劃分:

i從左往右掃,j從右往左掃;

如果i>=j迴圈終止

否則交換i,j對應的值(這裡相當於又找到了乙個大於等於key和乙個小於等於key的數,i++,j–)

(python沒有do while 寫成這個會比較簡單)

def

quicksort

(nums,p,r):

if p>=r:

return

key=nums[p]

i=p+1

#從左往右

j=r #從右往左

while

true:

while i<=r and nums[i]1

while nums[j]>key:

j-=1

if i>=j:

break

#此時nums[p+1,,,i-1]都小,注意i可能為r+1

#nums[j+1,r]都大

nums[i],nums[j]=nums[j],nums[i]

i+=1

j-=1

nums[p],nums[j]=nums[j],nums[p]

quicksort(nums,p,i-1)

quicksort(nums,j+1,r)

return

如果對於排序好的數,選取第乙個元素做劃分會導致效率的降低(平方級別)。

所以應該選擇隨機選擇劃分元素.

在 if的後面加上:

x=random.randint(p,r)

nums[x],nums[p]=nums[p],nums[x]

修改 if

快速排序花費了大量的時間來排序很小的子陣列,如果採用插入排序會更快

可以修改為:

if p-r

return

其中,cutoff是乙個小整數,然後選擇其他排序演算法進行排序。

快速排序改進

快速排序平均複雜度為o nlgn 最壞情況為o n 2 即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,所以快速排序時間複雜度下界為o nlogn 最壞情況下為o n 2 1.如果在排序時選取最後乙個元素為基準,則可以通過以下方法來避免劃分的不平衡。int ...

快速排序改進

public class quicksort exec a,lo,j return j 用分治法來進行快速排序 public static void sort comparable a,int lo,int hi public static void show comparable a system...

快速排序的改進

改寫partition演算法。要求 一次partition之後,小於基準元素key的數在左邊,等於key的在中間,大於key的在右邊 思路一 參照演算法導論上的思想,做出改進 i指向小於基準元素的序列的末尾,j指向等於基準元素的序列的末尾,k指向當前遍歷到的元素。include include us...