五種排序演算法 快速排序

2022-09-20 03:30:12 字數 1274 閱讀 6951

1、在陣列中選乙個基準數(通常為陣列第乙個)。

2、將所有比基準值小的值擺放在基準的前面,所有比基準值大的擺放在基準的後面(相同的數可以放到任意一邊);在這個分割槽推出之後,該基準就處於數列的中間位置。

3、遞迴地把「基準值前面的子數列」和「基準值後面的子數列」進行排序。

下面以數列a=[30,40,10,20,50]為例,演示它的快速排序過程:

上圖只是給出了第一趟快速排序的流程。在第一趟中,設定x=a[i],即x=30.

(01)從「右-->左」查詢小於x的數;找到滿足條件的數a[j]=20,此時j=4;然後將a[j]賦值a[i],此時i=0;接著從左往右遍歷。

(02)從「左-->右」查詢大於x的數;找到滿足條件的數a[i]=40,此時i=1;然後將a[i]賦值a[j],此時j=4;接著從右往左遍歷。

(03)從「右-->左」查詢小於x的數;找到滿足條件的數a[j]=10,此時j=3;然後將a[j]賦值a[i],此時i=1;接著從左往右遍歷。

(04)從「左-->右」查詢大於x的數;找到滿足條件的數a[i]=60,此時i=2;然後將a[i]賦值a[j],此時j=3;接著從右往左遍歷。

(05)從「右-->左」查詢小於x的數;沒有找滿足條件的數。當i>=j時,停止查詢;然後將x賦值給a[i]。此趟遍歷結束!

(06)安裝同樣的方法,對子數列進行遞迴遍歷。最後得到有序陣列。

二、快速排序的時間複雜度和穩定性

快速排序穩定性

快速排序是不穩定的演算法,它不滿足穩定演算法的定義。

演算法穩定性---假設在數列中存在a[i]=a[j],若排序之前,a[i]在a[j]前面;並且排序之後,a[i]仍然在a[j]前面。則這個演算法是穩定的。

快速排序時間複雜度

快速排序的時間複雜度在最壞情況下是o(n^2),平均的時間複雜度是o(n*lgn)。

這句話很好理解:

假設被排序的數列中有n個數。遍歷一次的時間複雜度數o(n),需要遍歷多少次呢?至少lg(n+1)次,最n次。

(01) 為什麼最少數lg(n+1)次?快速排序數採用分治法進行遍歷的,我們將它看作一顆二叉樹,它需要遍歷的次數就少二叉樹的深度,而根據完全二叉樹的定義,它的深度至少是lg(n+1)。因此,快速排序的遍歷次數最少數lg(n+1)次。

(02)為什麼最多數n次?這個應該非常簡單,還是將快速排序看作一顆二叉樹,它的深度最大是n。因此,快速排序的遍歷次數最多是n次。

排序演算法(五) 快速排序

在陣列中選取乙個數作為基準值,進行乙個partition過程,將小於該數的放在左邊,大於的放在右邊,等於的放在中間,再對左右分別進行該操作。時間複雜度 每次partition可以將乙個數字位置確定,將陣列劃分為兩部分,因此想要有序,理想情況每次剛好兩邊大小一樣,則一共需要logn次partition...

排序演算法(五) 快速排序

快速排序是一種效率很高的排序演算法,也是我們使用最多的一種排序演算法。快速排序原理 兩個指標分別指向陣列兩頭元素,將陣列第乙個元素儲存下來,作為基準數,兩個指標開始向中間移動,先移動陣列尾部指標,直到發現所指元素比基準數小時,將這時候所指向的數賦值給陣列頭部指標指向的位置,然後尾部指標停止移動,頭部...

排序演算法五 快速排序

取陣列最中間的那個數為基數 取哪乙個數為基數都可以,取中間的只是為了好理解 在左邊找乙個比基數大的數,在右邊找乙個比基數小的數,如果找到就交換兩個數的位置,交換過後再向下尋找,直到左邊的角標大於等於右邊則退出,一輪排序後,基數的左邊一定都是比基數小的,基數的右邊一定是比基數大的,注意 基數不一定還在...