進入 JavaScript 主題的第一站,先寫個面試常見的快速排序法(Quick Sort),順便聊聊「為什麼要練習演算法」。

快速排序法#

由小到大的版本:

function quickSort(arr) {
  if (arr.length < 2) return arr;
  const [p, ...ary] = arr;
  const left = [],
    right = [];

  ary.forEach((c) => {
    if (c < p) left.push(c);
    else right.push(c);
  });

  return [...quickSort(left), p, ...quickSort(right)];
}

用的空間有點多,這版本不是原地交換的版本。

快速排序的基本概念:

  • 挑出一個 樞紐(pivot)
  • 其他元素與樞紐比較:由小到大時,比樞紐小的往前放、大的往後放,樞紐位置同時也固定下來
  • 對「比它大的部分」及「比它小的部分」遞迴執行
  • 直到陣列為空或只有一個元素就直接回傳

演算法#

先思考一下,演算法的本質是什麼?其實就只是前人經驗與智慧的累積,是一些優秀的解決問題的方法。

如果能理解各個演算法的思考過程,遇到合適的情境便能套用,甚至觸類旁通,思考出更好的解決方案;例如 Tim Peters 將 Merge sort 與 Insertion sort 的優點結合,利用原始資料中連續升序或降序的片段,進一步優化了排序,發明了 Timsort。

換言之,學習演算法,就如同是在學習高手們的思考方式,讓你在面對問題時,能找出更「聰明」的解決方法。

面試#

那為什麼許多公司行號的面試都喜歡考演算法呢?作者認為有兩種可能:

  1. 把演算法當成一種門檻,認為熟知這些是這個職位的基本條件。
  2. 藉由一個已知最佳解的問題,鑑定求職者的邏輯是否正確、思路是否靈活清晰。

第 1 種情況的公司其實不少,可能一些熱門的職位求職者眾多,徵才方希望透過設定好的門檻,快速篩選出合適的人選。

第 2 種情況,通常就是讓許多求職者感到害怕的現場筆試甚至白板題;但從徵才方的角度思考一下,其實也不用太過害怕,畢竟就只是想看你的思考邏輯,而不是要你一口氣默寫出最佳解,通常面試官也會給予適當的引導。

刻意練習#

當然,有公司會考就有人會準備,訪間也有許多練習演算法的解題網站:

  • LeetCode:網羅全球各大公司的面試考古題,解題後能看到解題時間等指標,付費版甚至有模擬面試。
  • CodeWars:多了經驗值、等級、戰隊、排行榜等遊戲化要素,並開放讓所有使用者自創題目,除了基本演算法題型外,還有各種產業可能遇到的真實問題。

刻意練習是很重要的事情,畢竟只是讀過看過,並不能讓人真正學會一件新事物。

目的只是通過面試的刻意練習演算法,是毫無意義的。透過大量刷題也許可以熟記這些考古題的題型,但如果不能真正的認識、理解、掌握,進而內化成自己的功力,最終也只是淪為背誦答案的考試機器。

結語#

演算法與資料結構是軟體工程的基礎學科,掌握其中知識是職涯發展的必經之路。為了求職刷好刷滿,比不上為了讓自己更強而刻意練習。

原文出處#

  • 原書/iThome:https://ithelp.ithome.com.tw/articles/10219151