經典排序演算法回顧:

陈晓猛發表於2024-03-14

排序演算法有非常多,應用也非常多,在各種筆試面試中也常常出現,所以現在就來複習一下相關的排序演算法吧!
下面會介紹多種排序演算法,在此之前先說一下,排序演算法的評價主要有以下幾個方面:

排序演算法的時間複雜度;
排序演算法的空間複雜度;
排序演算法的穩定性
其中前兩個是老生常談了,基本提到演算法都會考慮這兩點。第三點中排序演算法的穩定性是指如果待排序列中存在相同元素時,經過排序之後相同元素的先後順序是否被打亂,如果保持不變則說明這個排序演算法是穩定的,否則稱該排序演算法是不穩定的。


1.快速排序(quickSort)
快速排序是最常見的排序演算法之一,需要重點掌握,要能夠手撕程式碼的程度。
快速排序其實用了分而治之 的策略,它的一個核心思想就是:選擇一個樞紐(pivot),透過元素交換使得比pivot小的元素在它左邊,比它大的元素在它右邊,再分別對左右兩邊做相同的操作。

快速排序的執行時間與資料序列的初始排列和基準值選取有關,
最好的情況下 每次選擇的主元都能夠正中的劃分序列,此時的時間複雜度是T(N)=O(N*logN),
在最壞的情況下 ,每次選擇的主元都是極值的話,時間複雜度會達到T(N)=O(N^2)。(這個可以想象,如果每次主元都是最大值的話,那麼劃分相當於無意義,每次都要將剩餘的所有元素進行排序,這樣起不到快速排序的效果)

快排的實現過程中有兩個重要的步驟:

選主元(pivot)
選主元為何重要,根據前面提到的快排的時間複雜度就可以知道,選取主元會非常大程度影響快排的效率。
一般情況下,最經典的選取主元方式就是任意頭/中/尾的其中一個,這是最方便的做法。但是如果遇到本身已經有序的極端情況,選擇頭或尾作為主元就會非常危險。
那麼也可以選擇取頭/中/尾的中位數作為主元(mid_of_3)。
或者可以隨機選擇一個未排序序列中的數作為主元,這也是有效的降低取到極值機率的辦法。

相關文章