排序演算法總結 快速排序

2021-09-07 23:27:59 字數 2844 閱讀 3344

快速排序的一般步驟如下:

1.先從數列中取出乙個數作為基準數。

2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

3.再對左右區間重複第二步,直到各區間只有乙個數。

(來自於《啊哈!演算法》)

這裡需要解釋一下為什麼每次交換的時候都需要右邊的哨兵先走:最主要是相遇點的問題,演算法的最後,是需要將相遇點與基準數相互交換的,因此這裡必須要讓相遇點小於基準數。而相遇點要麼是左邊哨兵先到相遇點,然後右邊哨兵走過去相遇的,要麼就是右邊哨兵先到相遇點,左邊哨兵走過去相遇的。

在左邊哨兵先走情況下:

這種情況下每一輪都是先左後右,如果左邊的停了,該右邊行動了,這說明左邊的找到了比基準數大的數;如果右邊的停了,左邊的該行動了,說明上一輪交換已經結束了,可以進行新一輪的先左後右了,因此,在相遇前的最後一輪搜尋中

如果是左邊哨兵先到相遇點,讓右邊哨兵去靠近,那麼說明這個時候左邊哨兵腳下踩的必定是比基準數大的數,然後右邊哨兵靠近後相遇,那麼相遇點的數就比基準數大了,這樣顯然是不行的;

如果是右邊哨兵先到相遇點,讓左邊哨兵去靠近,那麼說明這個時候右邊哨兵腳下踩的必定是已經在上一輪交換後的比基準數大的數,然後左邊哨兵靠近後相遇,那麼相遇點的數就比基準數大,這樣也是不行的。

因此,不管是左邊哨兵先站好位置還是右邊哨兵先站好位置,在左邊哨兵先走的情況下,最終相遇點的數是必定大於基準數的,因此不能讓左邊哨兵先走。

再來看右邊哨兵先走的情況:

這種情況下每一輪都是先右後左,如果左邊的停了,該右邊行動了,說明上一輪已經結束了,可以進行新一輪的先右後左了。如果右邊的停了,該左邊行動了,說明右邊的找到了比基準數小的數,因此,在相遇前的最後一輪搜尋中

如果是左邊哨兵先站好位置,讓右邊哨兵去靠近,那麼說明這個時候左邊哨兵腳下踩的已經是上一輪交換結束後的小於基準數的數,然後右邊哨兵靠近再相遇,相遇點就不大於基準數了,這樣是符合要求的;

如果是右邊哨兵先站好位置,讓左邊哨兵去靠近,說明這個時候右邊哨兵腳下踩的是比基準數小的數,然後左邊哨兵靠近後相遇,那麼相遇點的數就比基準數小,這樣也是符合要求的。

因此,不管是左邊哨兵先站好位置還是右邊哨兵先站好位置,在右邊哨兵先走的情況下,最終相遇點的數必定是小於基準數的,這是符合要求的,因此必須讓右邊哨兵先走。

同樣,如果基準數是陣列最右端的數,那麼相應的就應該先左後右了。

#include //#include #include using namespace std;

int getindex(vector& nums,int left,int right) //獲取相遇點

int main()

{ cin.clear();

vectornums;

int num;

while(cin>>num)nums.push_back(num);

int left=0;

int right=nums.size()-1;

qsort(nums,left,right);

for(int i=0;i<=right;i++)cout最好情況是指每一次相遇點恰好二分區間,這樣就對陣列起到了乙個二分的作用,是效率最高的,最終就需要分logn次了,而每一次都需要將整個區間內的陣列遍歷一邊,因此時間複雜度就是n*logn了,時間複雜度分析如下:

容易想到,如果分治的兩個子區間其中有乙個為0,另乙個就是n-1,此時即為最壞情況,這個情況主要出現在陣列原本就是處於公升序或降序狀態,對於公升序,每一次右邊哨兵都需要從右往左跑到頭,對於降序,每一次左邊哨兵都需要跑到最右邊去,這兩種情況都是的快速排序退化成類似氣泡排序,時間複雜度自然就是o(n)了,時間複雜度分析如下:

綜上可知,快速排序的最好情況下時間複雜度為o(nlogn),最壞情況下時間複雜度為o(n2)。

要分析穩定性,那麼就需要關注快速排序中對與基準數相等的數(簡稱相等數)的處理方式。在快速排序中,左右哨兵進行搜尋時對於相等數並不敏感,兩邊遇到相等數後都會選擇無視,然後繼續搜尋下乙個數,這樣問題就出現了:

以 基準數為第乙個數為例,那麼相等數是位於基準數右邊的,此時如果右邊哨兵發現了相等數,不對其進行操作,那麼相遇點肯定就在相等數的左邊了,最終基準數交換後依舊處於相等數右邊,與原先的基準數、相等數二者之間次序相同,是穩定的;

另一方面,如果左邊哨兵發現了相等數,也不對其進行操作,那麼相遇點肯定就在相等數的右邊了,最終基準數被交換到相等數的右邊,此時相等數與基準數二者之間的次序改變了,是不穩定的。

綜上所述,快速排序是一種不穩定的排序演算法。

排序演算法總結(快速排序)

終於不用改 了,希望文章大修順利!穩定的演算法 不穩定的演算法 內部排序 排序過程不涉及內 外存交換 外部排序 排序過程有內 外存交換 in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基...

排序演算法總結 快速排序

前面說的氣泡排序是一種交換排序。交換排序還有一種演算法,就是快速排序演算法。快速排序的核心思想是分而治之。意思就是選出乙個基準 可以是第乙個元素,也可以是最後乙個。為了方便我們選取第乙個 將小於這個基準的全部元素都放在這個基準的左邊,大於這個基準的全部元素都放在基準的右邊。然後分別對左右兩個陣列在進...

內排序演算法總結 快速排序

快速排序 快速排序是一種在含n個數的輸入陣列上最壞情況執行時間為o n2 的演算法,平均效能的期望執行時間為o nlgn 且o nlgn 記號中隱含的常數因子很小。另外,它還能夠進行原地置換排序。快速排序是基於分治模式上的,分治過程三個步驟 1.分解 把陣列a p.r 分成兩個非空子陣列a p.q ...