1. 程式人生 > >結合題目講解“快速排序演算法”

結合題目講解“快速排序演算法”

  理論很豐滿,實戰很骨感,作為一個嫌棄自己的胖子,我對實戰很是熱衷,導致總是對理論知識不上心,做題的時候就蒙了。

  比如有這樣一道自考題:


  看完以後第一感覺就是翻書,因為覺得過了一遍書中知識點的情況下,做題的時候再仔細看看,然後推敲那些自己還沒有掌握好的知識效果會更好,在這個過程中暴露了自己看書的一個很不好的習慣,就是知道把握全域性,也知道要注重每個標題下邊的初始知識介紹,但是總是莫名其妙地就一頭扎進了書上的例題講解中不能自拔,還傻傻地問自己為什麼是這個樣子,書上講過嗎?結果很是打臉,疑惑之處的解答基本上會在每個小標題下邊那個“開門見山”的位置上,呵呵~~~在想以後是不是學習時候先看例題,再回去看書……

  書中對快速排序是這樣介紹的:它是交換排序的一種,實質上是對氣泡排序的一種改進。基本思想:在n個記錄中取某一個記錄的鍵值作為基準(通常取第一個記錄的鍵值作為基準)通過一趟排序,將待排序的記錄分為小於或是等於這個鍵值和大於這個鍵值的兩個獨立部分,這時一部分的記錄鍵值均比另一部分記錄鍵值要小,然後,對這兩部分記錄繼續分別進行快速排序,以達到整個序列有序。

  這道題的答案如下

  

  我在做題的時候發現只會第一趟排序,第二趟不知從何下手了,其實就是看書的時候沒留意上文闡述的基本思想,後來終於搞明白了。下面是自己根據這道題,以及解題過程中出現的小失誤,總結的解題分析,相當於是對書中基本思想的擴寫吧(以升序排列為例

):

  1、很廢話,若是要求升序排列,比較之後調換位置就把小的放在左邊,降序排列同理;
  2、第一趟排序的時候預設以第一個數為基準;


  3、簡言之,就是一來一去:挑選完基準資料後,要注意的是,不是跟和它挨著的那個數開始往後依次比較,而是將這個待排序序列末端的資料選做比較物件,從末端開始往回比較,遇到比它小的直接交換位置,比如上題中的預設首位基準資料265,首先和末位的438比較,可知438比它大,那麼就和438前邊的資料比較,發現076比它小,於是,265就和076交換位置,此時,265的位置發生了改變,比較方向就需要發生改變了,期初它的比較物件是從後往前,經過這次交換後,它的比較物件的選擇順序就要變成從前往後

,此時和它比較的是301,比它大,二者交換位置,依照上述方法繼續接下來的工作,得到了第一趟的排序結果。

  4、注意一趟排序是由多次比較交換位置得到的,即看清一趟和一次
  5、通過觀察答案所展示的排序過程我們會發現,基準是用來作為子序列的劃分界限的,很像是分塊,劃分後,它的左邊都是比它小的,右邊都是比它大的,第一趟排序的基準是第一個數,第二趟排序的基準有兩個,分別是每個子序列(用[]括起來的部分)的第一個數,他們各自負責自己所在塊的排序,排序方法同序號3所述。
  6、在得到最後的排序結果之前,我們會發現待排序序列都在[]裡邊,基準都在外邊,就像圖中標註的那樣,上一趟待排序子序列中的第一個資料會成為下一趟排序的基準。

  PS:上圖中第四趟只有一個數據742是在[]中的了,我在做題的時候以為到第四趟就截止了,畢竟它只剩下一個待排序數字獨立成為一個序列了,後來發現竟然還有第五趟,其實這不難理解,第五趟只是起到了一個確定作用,達到去除第四趟結果那個[]的作用。

  站在個人角度而言,這篇部落格,敘述的貌似是快速排序方法,其實算是對自己學習方法的一個反思吧:

  (1)不要把全域性觀忘了,要注意看書的側重點;

  (2)切忌眼高手低,不要覺得自己曾經接觸過相關知識就覺得自己掌握得很好,從而可以繞開理論知識了,有些實戰之前,還是需要鞏固下理論知識的。