快排及優化

2021-09-26 06:03:57 字數 2606 閱讀 8369

快速排序的本質就是選取乙個基準數,通過一次快排把基準數大的都放在基準數的左邊,把比基準數小的放在基準數的右邊,這樣就找到了基準數在陣列中的正確位置。

然後可以用遞迴的方式分別對前半部分和後半部分排序,最終實現整體陣列有序。

所謂排序的穩定性,就是指在排序過程中,在對某關鍵字排序後會不會改變其他關鍵字的順序。快排會改變,所以不是穩定排序。

常規**1:

def

adjustpartition

(list1,low,high)

:if low < high:

left = low

right = high

key = list1[left]

while left < right:

while left < right and list1[right]

>= key:

right = right -

1 list1[left]

= list1[right]

while left < right and list1[left]

<= key:

left = left +

1 list1[right]

= list1[left]

list1[left]

= key

adjustpartition(list1,low,left-1)

adjustpartition(list1,left+

1,high)

return list1

常規**2:

def

quick_sort

(arr):if

len(arr)

<2:

return arr

key = arr[0]

# 以第乙個關鍵字作為基準數

left, right =

,[] arr.remove(key)

for item in arr:

if item >= key:

else

:return quick_sort(left)

+[key]

+ quick_sort(right)

python一行**實現快排:

def

quick_sort

(a):

iflen

(a)>1:

return quick_sort(

[i for i in a[1:

]if i <= a[0]

])+[a[0]

]+ quick_sort(

[i for i in a[1:

]if i > a[0]

])else

:return a

轉化為一行:

quick_sort =

lambda a:a if

len(a)

<=

1else quick_sort(

[i for i in a[1:

]if i <= a[0]

])+ \[a[0]

]+ quick_sort(

[i for i in a[1:

]if i > a[0]

])

如果陣列元素是隨機的,那麼程式的執行時間不會有太大的波動。如果陣列元素已經基本有序時,此時的固定基準劃分就容易產生最壞的情況,即快速排序變成氣泡排序,時間複雜度為o(n2n^

n2)。eg: 序列1 2 3 6 12 18,如果用固定基準進行快排:(【】內為基準數)

第一趟:【1 】2 3 6 12 18

第二趟:1【 2】 3 6 12 18

第三趟:1 2 6 12 18

第四趟:1 2 3 12 18

第四趟:1 2 3 6 18

(1)固定基準

比如每次以第乙個關鍵字作為基準數。可能會退化為氣泡排序。

(2)隨機基準

可以利用隨機函式隨機生成在[low,high]範圍內的數作為基準數的下標。

(3)三數取中

隨機基準選取的隨機性,因此即使是同乙個陣列每次效率也是不一樣的,此時可以選擇三數取中的方法選取基準數。它的思路是:選取陣列開頭,中間和結尾的元素去比較,選擇中間的值作為快排的基準。這種方式既能解決待排陣列基本有序的情況,而且選取的基準也不是隨機的。

eg:序列1 2 3 6 12 18,30,如果用三數取中進行快排:

因為:陣列開頭是1,中間是6,結尾是30

所以:所以基準數選擇6進行快排。

在陣列長度大於某乙個閾值範圍時,使用遞迴快排,當資料長度小於閾值時,使用插入排序。因為處理較短序列時插入排序效果更好。

在partition中選取基準數時,選取三路取中。

進行三路快排優化。即將陣列劃分為左邊小於基準數,中間等於基準數,右邊大於基準數,這樣兩端遞迴時可以縮小遞迴陣列的大小。

快排優化 1

include define max 100 儲存的最大值 void swap int a,int b int numberofthree int arr,int head,int end if arr head arr end if arr mid arr head 此時,arr mid arr ...

快排的幾種優化方案

先來複習下找基準的方法 public static int partion int arr,int start,int end if start end else while start end arr start tmp if start end else arr start tmp return...

快排的優化 參照SGI STL sort

快排,大家都知道,時間複雜度最好情況是o nlogn 最差情況是o n 雖然平均情況下是o nlogn 中最好的,因為係數 k 比較小,但是最差情況卻讓我們直搖頭,所以還有優化的空間。快排的兩個優化點 1 當排序個數較少時,改為插入排序,減少遞迴的呼叫次數 2 當有惡化為最差情況時,改用堆排序 接下...