講給對方聽的算法--快速排序(快速選擇)

有時候,想起來三四年前抱着紅色的算法書籍,以爲這是本身的信仰,本身也以爲很是開心,編程都有了底氣。可是也是看完就會忘記,啥也記不住。算法

現在想象,也是看過不少次,也聽過不少人說過,現在也是忘了。挺無奈。編程

有一天早起,聽了一下快速排序數組

基本思路:ide

在一個序列中,只有整數,8,2,5,7,4優化

第一步,選擇一個基準,好比選擇第一個,8(怎麼選擇也是能夠優化,優化不影響算法思路)code

第二步,空出8的位置,由於咱們要給8找到序列中正確的順序位置(由於選擇第一位,能夠從最後往前比較,不會重複)排序

第三步,將隊列中的數字與8比較,小的放在左邊,大的放在右邊(操做形式是)
3.1-->假如從右邊(從左邊會重複混亂一點)開始,數組下標走到最後一位,4< 8,那麼4填到空位,此時序列爲(?)
答案:4257()
3.2-->數組下標走到倒數第二位,7< 8,不用動,已經在左邊了。序列是?
答案是4257()隊列

依次繼續日後,就能夠寫出來。
依次序列是5< 8,, 4257()
2 < 8, 4257()
4 < 8, 4257()
到達第一位了,
說明8的序列位置找到了,就是最後一個。序列就是
42578it

第三步,操做完成
第四步,繼續選擇第一位,4做爲基準,重複第三步,序列依次是
判斷是否是比較過的,8跳過,7>4,不動,序列是()2578
5>4不動,序列是()2578
2<4,交換,2()578,已經到最前,說明4的序列位置找到了,就是第二
24578class

第五步,選擇按順序選擇下一位基準數,2,循環以前的處理

這就是基本思路。

延伸出來的就是,快速選擇
選擇這個序列第K個數字(按照順序,排第幾的數)

情景:好比說上面的序列8,2,5,7,4,我想找到排第三位的數字,從小到大排。
答案你們都知道,應該算是5
思路:基準值排完以後,左邊都是比他小的 ,即便無序也不重要,就知道它是第幾位。
因此查找第k個數,就是找前面有k-1個數的位置上該有的基準數。

找到的過程以下:
第一步,依舊是按照快速排序,選擇一個基準數(基準數的選擇仍是能夠優化)
咱們依舊選擇8,借鑑以前:
說明8的序列位置找到了,就是最後一個。序列就是
42578
第二步,比較8的位數與目標位數。
比較目標,3<5,因此拋棄基準數的右邊,從前面四位再快速排序。(找這個序列排第三位的(這裏也好好理解一下下))
剩餘的序列是4257
第三步,選擇一個基準數,假如依舊從開頭選,4,
通過比較,借鑑以前:
說明4的序列位置找到了,就是第二個。序列就是
2457
第四步,比較4的位數與目標位數
比較目標,3> 2,因此拋棄基準數的左邊,從後面兩位再快速排序。
(找這個序列排第(3-2=1)1位的)(這裏好好理解一下)
第五步,57,依舊選擇開頭,5,從最後一位比較,7>5,不動,是最前一個數,
說明5的序列位置找到了,就是第1個。序列就是
57

此刻就快速選到了第三位的數字就是5,結束。

                這樣咱們就描述完了快速排序算法的思想,也順道延伸了一下快速選擇。

                有緣下次再見。
相關文章
相關標籤/搜索