之前的幾次面試都有問到快速排序,我的寫法都是按照演算法導論上隨便寫寫的:
#快速排序
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...