快速排序的疑難雜症

2021-09-29 17:54:53 字數 1347 閱讀 5582

最近要準備藍橋杯和學校的程式設計的比賽,所以拿起了多少年沒看過的演算法了,一看發現自己的知識網全是漏洞了(畢竟兩年了),所以開始重新複習和學習,希望自己能重新拾起自己原來的本領並甚至更進一步。

重新摸起演算法,就不得不說不說起演算法的入門虎之一的快速排序,當年也是被折磨的死去活來的,但是如今看看網路上的教程,突然發現其實快排很簡單(大概)。

確實,快速排序的根本思想其實和氣泡排序差不多,就是找到乙個數排序後應該在的位置,然後把他放進去,而在快速排序中體現的方式就是,找到乙個基準數,然後把比他大的放在左邊,比他小的放在右邊(此時他的位置不就是他應該在的位置嘛!!),所以其實每一輪快速排序都是為乙個數的排序。然後對他左面和右邊未排序的數字進行排(分治思想)。

假如你要將比你大的數放在右面,則你需要,首先移動左哨兵,因為在左右哨兵相遇的最後一次移動中:

1.假如最後是右哨兵碰上左哨兵,則此時兩者指向的值一定是比基準值小的(因為左哨兵沒有動,而在上一輪左哨兵指向的點是交換為乙個比基準值小的值)。

2.假如是左哨兵碰上右哨兵,此時指向的仍是乙個比基準值小的值,因為,左哨兵已經探索完並停下,說明他指向的是乙個比基準值小的點,否則他不會停下。

綜上,因為基準值選的為第乙個點,也就是說無論如何交換,和基準值交換的一定要為乙個乙個比他小的值,否則在最後一輪排序後,會導致比基準值大的值出現在基準點的左面,發生錯誤,如果你是打算降序排序,仍需要先讓左哨兵移動(基準值為第乙個)。

我們可以不需要去移動基準點,只是隨便找個基準值,讓大於他的,都在最後i,j相遇的地方(記為k),讓k前的數大於等於基準值,而k後面的值均小於基準值(降序還是公升序由你自己決定,此處只是舉個例子),然後對k之前的和後面的分別重複如上過程,最後在分治演算法的思想指導下,每個序列都各自為有序數列,且各個序列之間也為有序數列,即將整個問題分成無數個小問題去解決,而此時,先移動哨兵還是後移動哨兵並沒有區別,你不需要找到乙個位置去放基準點(就是找到基準點在按公升序應該在的位置),這種思想並不是去給乙個點找到他應該在的位置,而是以他的值將序列分為兩個部分,在有限次劃分後,當剩下只有乙個數字的序列時,整個序列就是有序的了!

下附**:

void pai(int h,int e)

} while(k<=j);

if(kh)pai(h,j);

}

對於以上兩種方式實現的快排我還沒有進行速度比較,待更新。

希望你能找到屬於自己的快排實現演算法

Hadoop疑難雜症

前天安裝了pig,本來寫了條pig latin,但一直卡在 17 05 07 17 47 07 info mapreduce.job running job job 1494150363568 0001跑不通,想著肯定是mapredcue自身有問題,於是開始了艱苦的檢錯之旅,從csdn到stackf...

Appium疑難雜症

坑之初體驗 1.session大於60秒沒接收到命令自動關閉 python desired caps 在啟動配置裡面加入newcommandtimeout引數 desired caps newcommandtimeout 200 但是注意cnpm預設在當前目錄安裝npm包。3.uiautomatio...

疑難雜症 列舉

1.列舉是使用者自定義的整數型別 2.關於列舉的一般用法,參照 c 中的列舉 3.從字串中獲取列舉值 定義如下的列舉 public enum timeofday 從乙個字串得到列舉值,並轉換為整數 timeofday time timeofday enum.parse typeof timeofda...