排序

83 阅读5分钟

你有烹飪的經驗嗎?如果沒有也沒關係,那正好可以去翻閱食譜,如果今天想吃青菜,就可以參閱食譜上的步驟說明

  1. 買菜、挑菜
  2. 洗菜、洗鍋子
  3. 開抽油煙機、開瓦斯
  4. 熱鍋子、倒油
  5. 把菜丟進去拌炒
  6. 調味、盛盤

image.png

根據上述例子,根據情況不同,操作步驟也會不一樣,而這些根據各式各樣不同情況或問題而推出的食譜,我們只要跟著步驟做,就能解決我們各式各樣的飲食需求

Algorithm

  1. 輸入:最初提供的資料
  2. 輸出:最後得到的資料
  3. 明確的指令:明確清楚定義所要執行的動作
  4. 有限的步驟:步驟有一定的數量,不會永無止盡
  5. 有效的作法:可驗證資料的正確性,例如可用紙本驗算

你有用過篩子嗎?像是篩選麵粉或是篩選盆栽的土壤,都會看到篩子的身影,篩子是一種過濾器,那面有很多小孔,體積大於過濾孔的物品會被留在篩子上面,而體積小於過濾孔的細碎物品則會通過篩子往下面掉,這時候我們下面通常會再多放一個接物品的盆子,這個過篩的動作,會把物品一分為二,分別是大於過濾孔的與小於過濾孔的,而過篩有一個重點就是要挑選合適的篩子,不然過濾孔過大等於物品,物品通通會通過篩子,等於是沒過濾,然而過濾孔太小,則物品都卡在篩子上面下不去,所以如何篩選出適合的物品其過濾孔很重要

image.png

Quick Sort

快速排序法採用分而治之法 (Divide-and-conquer),把大問題切割成小問題,會於資料中找到一個基準值(Pivot),並將資料逐一與這個值相比較,最後可以得到兩個部分,分別為大於這個值小於這個值的數值,大於基準值的數值放在右邊,小於基準值的數值放左邊基準值就很像是我們使用的篩子,篩完之後物品就會被區分成兩塊

步驟 2 - 數值的比較,交換

身為東方人,最喜歡作的動作大概就是比較了吧 XD,跟兄弟姊妹比,跟同學比,甚至連鄰居也難逃被拿去比較,那要比什麼呢?無非是成績啦,或是身高、體重也會加入評比範圍,想必大家都有經歷過這個過程吧

image.png 以前安排學校的班級座位時,都會請同學們依照身高排列好,一直覺得這個過程很殘酷,因為很容易知道誰是班上最高,但同時,也會知道班上誰最矮 XD image.png

合併排序

合併排序法顧名思義就是會有合併的動作,在合併之前想必應該會有切割的動作,一起來看看這這分分合合的演算法吧 XD 你有用切水果的經驗嗎?通常我們都習慣將一顆水果對半切,因為一整顆的水果比較不容易直皆整顆嗑,例如:西瓜 XD,在對半切再對半切至小塊之後,就很容易不知不覺吃掉半顆,最後通通在肚子裡面集合了 XD\

image.png 對半的這個概念,也很像有些店家的手工麵的製作過程,會看到師傅把麵團甩成麵條,過程中不斷的對折再對折,最後在剪斷就會變成可以下鍋煮的麵了

image.png

這樣一路分之後,會發生什麼事呢?就像三國演義裡面有這麼一句話:「天下大勢,分久必合,合久必分。」,其中的分久必合很有合併排序演算法的味道,分裂完之後,就會開始統一

image.png

合併排序法 Merge Sort

image.png

image.png

堆積排序法

喝飲料的時候常常可以觀察到,有些東西會沉在杯底,例如珍珠,有些東西則會浮在飲料上面,像是冰塊或水果切片,而根據物品的體積或密度,可以推得它們在水杯中的固定的常態分佈和固定的順序,繼續丟入冰塊,冰塊只會浮在水面,不會沉下去

image.png

你有聽過重要緊急四象限法則嗎?通常在一天內,我們需要處理很多事情,除了吃喝拉撒睡,還要認真工作或認真念書,有時候忙起來真的會當機,不知道到底該處理哪一件事情才好,本來不急的事情因為規畫不當,變成非常緊急,或是非常緊急的事情或沒有趕緊處理而造成大麻煩的事件也層出不窮,可能就是時間管理上面需要做一些調整,而重要緊急四象限法則可以協助我們找出事情的優先順序,讓我們清楚接下來要優先處理哪些事情

資料結構的堆積會將資料按優先順序排列,讓我們可以清楚知道現在最急或最不緊急的事情有哪一些,讓我們一起來認識認識吧

堆積 Heap

堆積是完整的二元樹,數值的排列分為兩種:最大堆積樹(Max-Heap) 與最小堆積樹(Min-Heap)

  1. 最大堆積樹 (Max-Heap)
    樹根為最大值,所有節點的值都會大於等於子節點的值

  2. 最小堆積樹 (Min-Heap)
    樹根為最小值,所有節點的值都會小於等於子節點的值

image.png