我最初創建此列表是為了成為軟體工程師的學習主題的簡短待辦事項列表,但它後來發展到了您今天看到的龐大列表。經過這個學習計畫後,我被亞馬遜聘為軟體開發工程師!你可能不需要像我一樣學習。不管怎樣,你需要的一切都在這裡。
我每天學習大約8-12個小時,持續了幾個月。這是我的故事:為什麼我為了 Google 面試而全職學習了 8 個月
請注意:您不需要像我一樣學習。我在不需要知道的事情上浪費了很多時間。更多相關資訊如下。我會幫助你到達那裡,不會浪費你的寶貴時間。
這裡列出的內容可以幫助你為幾乎所有軟體公司的技術面試做好準備,包括巨頭:亞馬遜、Facebook、谷歌和微軟。
祝你好運!
印尼語
保加利亞語
西班牙語
德文
日文(日本文)
馬拉地語
拋光
巴西葡萄牙語
俄文
Tiếng Việt - 越南語
烏爾都語 - affiliate
烏茲別克語
বাংলা - 孟加拉語
ខ្មែរ - 高棉語
簡體中文
繁體中文
南非荷蘭語
阿拉伯
法語
希臘文
義大利語
韓文(한국어)
馬拉雅拉姆語
波斯語 - 波斯語
泰盧固語
泰國
土耳其
Українська
奧古斯都
हिन्दी
成為贊助商並支持編碼面試大學!
這是我為成為大公司的軟體工程師而進行的數月學習計畫。
必需的:
有一點編碼經驗(變數、迴圈、方法/函數等)
耐心
時間
請注意,這是軟體工程的學習計劃,而不是前端工程或全端開發。其他地方確實有針對這些職業道路的超級路線圖和課程(有關更多信息,請參閱 https://roadmap.sh/ )。
在大學電腦科學課程中有很多東西需要學習,但只知道 75% 左右就足以進行面試,所以這就是我在這裡介紹的內容。對於完整的 CS 自學課程,我的學習計畫資源已包含在 Kamran Ahmed 的電腦科學路線圖中:https://roadmap.sh/computer-science
它是什麼?
為什麼要使用它?
如何使用
不要覺得自己不夠聰明
關於視頻資源的注意事項
選擇程式語言
資料結構和演算法書籍
面試準備書籍
別犯我的錯誤
您不會看到的內容
每日計劃
編碼問題練習
編碼問題
演算法複雜度/Big-O/漸近分析
資料結構
陣列
鍊錶
堆疊
佇列
哈希表
更多知識
二分查找
位元運算
樹木
樹 - 簡介
二元搜尋樹:BST
堆/優先隊列/二元堆
平衡搜尋樹(一般概念,不是細節)
遍歷:前序、中序、後序、BFS、DFS
排序
選擇
插入
堆排序
快速排序
歸併排序
圖表
指導的
無向的
鄰接矩陣
鄰接表
遍歷:BFS、DFS
更多知識
遞迴
動態規劃
設計模式
組合學(n 選 k)和機率
NP、NP 完全和近似演算法
計算機如何處理程式
快取
行程和執行緒
測試
字串搜尋和操作
嘗試
浮點數
統一碼
位元組順序
聯網
最終審查
更新您的履歷
找工作
面試流程和一般面試準備
面試時要考慮一下
有問題要問面試官
一旦你找到工作
---------------- 這一點以下的所有內容都是可選的 ----------------
附加書籍
系統設計、可擴展性、資料處理(如果您有 4 年以上經驗)
額外學習
AVL樹
八字樹
紅/黑樹
2-3個搜尋樹
2-3-4 樹(又稱 2-4 樹)
N 元(K 元、M 元)樹
B樹
編譯器
Emacs 和 vi(m)
Unix 命令列工具
資訊理論
奇偶校驗與漢明碼
熵
密碼學
壓縮
電腦安全
垃圾收集
平行程式設計
訊息傳遞、序列化和排隊系統
一個*
快速傅立葉變換
蒲隆地
超級日誌日誌
局部敏感哈希
范恩德博阿斯樹
增強資料結構
平衡搜尋樹
kD 樹
跳過列表
網路流量
不相交集和並集查找
快速處理數學
崔普
線性規劃
幾何,凸包
離散數學
有關某些主題的其他詳細信息
影片系列
電腦科學課程
文件
如果你想在一家大公司擔任軟體工程師,這些是你必須了解的事情。
如果你像我一樣錯過了獲得電腦科學學位的機會,這會讓你抓住機會,並節省你四年的生命。
當我開始這個專案時,我不知道堆疊和堆,不知道 Big-O 任何東西,也不知道有關樹的任何東西,也不知道如何遍歷圖。如果我必須編寫一個排序演算法,我可以告訴你這會很糟糕。我曾經使用過的每個資料結構都內建在該語言中,而且我根本不知道它們在幕後是如何運作的。我從來不需要管理內存,除非我正在運行的進程會給出“內存不足”錯誤,然後我必須找到解決方法。我一生中使用過一些多維數組和數千個關聯數組,但我從未從頭開始建立資料結構。
這是一個長期的計劃。這可能需要你幾個月的時間。如果您已經熟悉了其中的許多內容,那麼您花費的時間就會少很多。
⬆ 回到頂部
下面的所有內容都是一個大綱,您應該按照從上到下的順序處理這些項目。
我正在使用 GitHub 的特殊 Markdown 風格,包括用於追蹤進度的任務清單。
有關 GitHub 風格的 Markdown 的更多信息
在此頁面上,按一下頂部附近的「代碼」按鈕,然後按一下「下載 ZIP」。解壓縮該文件,您可以使用文字文件。
如果您在理解 Markdown 的程式碼編輯器中打開,您會看到所有內容都格式化得很好。
建立一個新分支,以便您可以檢查這樣的項目,只需在括號中放入 x:[x]
點擊「分叉」按鈕分叉 GitHub 儲存庫: https://github.com/jwasham/coding-interview-university
。
克隆到您的本機儲存庫:
git clone https://github.com/<YOUR_GITHUB_USERNAME>/coding-interview-university.gitcdcoding-interview-university git 遠端加入上游 https://github.com/jwasham/coding-interview-university.git git remote set-url --push upper DISABLE # 這樣你就不會將你的個人進度推回原始倉庫
完成更改後,用 X 標記所有框:
git commit -am “標記個人進度” git pull upstream main # 讓你的 fork 與原始 repo 的更改保持同步 git push # 只是推送到你的 fork
⬆ 回到頂部
成功的軟體工程師都很聰明,但許多人都有一種不安全感,認為自己不夠聰明。
以下影片可以幫助您克服這種不安全感:
天才程式設計師的神話
獨自前進是危險的:與科技中的隱形怪物奮戰
⬆ 回到頂部
有些影片只能透過註冊 Coursera 或 EdX 課程才能觀看。這些被稱為 MOOC。有時課程不上課,因此您必須等待幾個月,因此您無法訪問。
如果用免費且隨時可用的公共資源(例如YouTube 影片(最好是大學講座))取代線上課程資源,那就太好了,這樣大家就可以隨時學習這些資源,而不僅僅是在特定線上課程開課時學習。
⬆ 回到頂部
您需要為進行的編碼面試選擇程式語言,但您還需要找到一種可用於學習電腦科學概念的語言。
最好語言是相同的,這樣您只需要精通一種語言。
當我制定學習計劃時,我大部分都使用了兩種語言:C 和 Python
C:非常低的水平。允許您處理指標和記憶體分配/釋放,讓您感受到骨子裡的資料結構和演算法。在 Python 或 Java 等高階語言中,這些對您來說是隱藏的。在日常工作中,這非常棒,但是當您學習如何建立這些低階資料結構時,感覺接近金屬的感覺很棒。
這是一本簡短的書,但它會讓您很好地掌握 C 語言,如果您稍微練習一下,您很快就會精通。了解 C 語言可以幫助您了解程式和記憶體的工作原理。
您不需要非常深入地閱讀這本書(甚至不需要讀完它)。只需到達您可以輕鬆地用 C 語言進行讀寫的地方即可。
C無所不在。在學習過程中,您會在書籍、講座、影片中隨處看到範例。
C 程式語言,第二版
Python:現代且非常具有表現力,我學習它是因為它非常有用,並且還允許我在面試中編寫更少的程式碼。
這是我的偏好。當然,你做你喜歡做的事。
您可能不需要它,但這裡有一些學習新語言的網站:
鍛鍊
密碼戰
駭客地球
定標器主題(Java、C++)
Programiz PRO 社區挑戰)
您可以使用您熟悉的語言來完成面試的編碼部分,但對於大公司來說,這些都是可靠的選擇:
C++
爪哇
Python
您也可以使用這些,但請先閱讀。可能會有一些注意事項:
JavaScript
紅寶石
這是我寫的一篇關於選擇面試語言的文章:為程式設計面試選擇一種語言。這是我的帖子所基於的原始文章:選擇面試的程式語言
您需要對這門語言非常熟悉並且知識淵博。
閱讀有關選擇的更多資訊:
為您的程式設計面試選擇正確的語言
請在此處查看特定於語言的資源
⬆ 回到頂部
本書將為您的電腦科學奠定基礎。
只需選擇一種您熟悉的語言即可。您將進行大量閱讀和編碼。
C 語言演算法,第 1-5 部分(捆綁包),第 3 版
基礎知識、資料結構、排序、搜尋和圖形演算法
Python 中的資料結構和演算法
古德里奇、塔馬西亞、戈德瓦瑟
我喜歡這本書。它涵蓋了一切,甚至更多。
Python程式碼
我的發光閱讀報告:https://startupnextdoor.com/book-report-data-structs-and-algorithms-in-python/
您的選擇:
古德里奇、塔馬西亞、戈德瓦瑟
Java 中的資料結構與演算法
塞奇威克和韋恩:
演算法一
演算法二
演算法
涵蓋本書的免費 Coursera 課程(作者教授!):
您的選擇:
古德里奇、塔馬西亞和芒特
C++ 中的資料結構與演算法,第二版
塞奇威克和韋恩
C++ 演算法,第 1-4 部分:基礎知識、資料結構、排序、搜尋
C++ 演算法第 5 部分:圖形演算法
⬆ 回到頂部
你不需要買一堆這樣的東西。老實說,《破解程式設計面試》可能就足夠了,但我買了更多來給自己更多練習。但我總是做得太多。
這兩個我都買了。他們給了我很多練習。
程式設計面試揭秘:透過面試編碼,第四版
C++ 和 Java 答案
這是破解編碼面試的一個很好的熱身
不太難。大多數問題可能比你在面試中看到的更容易(根據我讀到的內容)
破解程式設計面試,第六版
用 Java 回答
選擇一項:
程式設計面試重點(C++版)
Python 程式設計面試要素
程式設計面試要素(Java 版) - 配套專案 - 書中每個問題的方法存根和測試案例
⬆ 回到頂部
這份名單在幾個月內不斷增長,是的,它已經失控了。
以下是我犯的一些錯誤,以便您獲得更好的體驗。您將節省數月的時間。
我觀看了幾個小時的影片並做了大量筆記,幾個月後,有很多我不記得了。我花了三天時間整理筆記並製作抽認卡,這樣我就可以複習。我不需要所有這些知識。
請閱讀以下內容,以免犯下我的錯誤:
保留電腦科學知識。
為了解決這個問題,我製作了一個小型抽認卡網站,我可以在其中添加兩種類型的抽認卡:常規和程式碼。每張卡都有不同的格式。我創建了一個行動優先網站,這樣無論我身在何處,我都可以在手機或平板電腦上查看。
免費製作自己的:
抽認卡網站儲存庫
我不建議使用我的抽認卡。太多了,而且大部分都是你不需要的瑣事。
但如果你不想聽我的話,那你可以:
我的閃存卡資料庫(1200 張卡):
我的抽認卡資料庫(極限 - 1800 張卡片):
請記住,我做得太過分了,卡片涵蓋了從彙編語言和 Python 瑣事到機器學習和統計的所有內容。這對於需要的東西來說太多了。
關於抽認卡的注意事項:當您第一次意識到自己知道答案時,請勿將其標記為已知。你必須看到同一張卡片並正確回答幾次才能真正了解它。重複會讓這些知識更深入你的腦袋。
使用我的抽認卡網站的另一個選項是 Anki,它已被多次推薦給我。它使用重複系統來幫助您記住。它用戶友好,可在所有平台上使用,並具有雲端同步系統。 iOS 上的費用為 25 美元,但其他平台上免費。
我的 Anki 格式抽認卡資料庫:https://ankiweb.net/shared/info/25173560(感謝@xiewenya)。
一些學生提到了空白的格式問題,可以透過執行以下操作來解決:打開卡片組,編輯卡片,點擊卡片,選擇“樣式”單選按鈕,然後添加成員“white-space: pre;”到卡類。
這非常重要。
在學習資料結構和演算法的同時開始編寫面試問題。
你需要應用你所學到的知識來解決問題,否則你會忘記。我犯了這個錯誤。
一旦您學習了一個主題,並且對它感到有些熟悉,例如連結列表:
開啟一本編碼面試書籍(或編碼問題網站,如下所列)
做 2 到 3 道有關鍊錶的問題。
繼續下一個學習主題。
稍後再回去做另外2、3道鍊錶題。
對你學到的每個新主題都這樣做。
在你學習所有這些東西的同時,而不是之後,繼續做問題。
僱用你不是因為你有知識,而是因為你如何應用這些知識。
這方面的資源,如下圖所示。繼續前進。
有很多幹擾因素會佔用寶貴的時間。集中註意力和專注是很困難的。打開一些沒有歌詞的音樂,你就能很好地集中註意力。
⬆ 回到頂部
這些是流行技術,但不屬於本研究計畫的一部分:
JavaScript
HTML、CSS等前端技術
SQL
⬆ 回到頂部
本課程涵蓋許多主題。每一項都可能需要您幾天的時間,甚至一周或更長時間。這取決於你的日程安排。
每天,學習清單中的下一個主題,觀看一些有關該主題的視頻,然後用您為本課程選擇的語言編寫該資料結構或演算法的實現。
你可以在這裡看到我的程式碼:
C
C++
Python
您不需要記住每個演算法。您只需要能夠充分理解它就能夠編寫自己的實作。
⬆ 回到頂部
Why is this here? I'm not ready to interview.
然後回去讀這篇文章。
為什麼你需要練習解決程式設計問題:
問題識別以及正確的資料結構和演算法的適用範圍
收集問題的需求
像在面試中談論解決問題的方法
在白板或紙上編碼,而不是在計算機上
提出解決方案的時間和空間複雜度(請參閱下面的 Big-O)
測試您的解決方案
有一個關於在面試中有條不紊、溝通地解決問題的精彩介紹。你也可以從程式設計面試書籍中得到這個,但我發現這個很出色:演算法設計畫布
在白板或紙上編寫程式碼,而不是在電腦上。使用一些範例輸入進行測試。然後輸入並在計算機上測試。
如果您家裡沒有白板,請從藝術品商店購買一個大繪圖板。你可以坐在沙發上練習。這就是我的「沙發白板」。我在照片中添加了筆只是為了縮放。如果您使用筆,您會希望可以擦除。很快就會變得混亂。我用鉛筆和橡皮擦。
編碼問題練習不是要記住程式設計問題的答案。
⬆ 回到頂部
不要忘記這裡的關鍵編碼面試書籍。
解決問題:
如何找到解決方案
如何剖析 Topcoder 問題陳述
編碼面試問題影片:
IDeserve (88 影片)
Tushar Roy(5 個播放清單)
超級適合問題解決方案的演練
Nick White - LeetCode 解決方案(187 影片)
對解決方案和程式碼的良好解釋
短時間內可以看好幾部
FisherCoder - LeetCode 解決方案
挑戰/練習地點:
Leet程式碼
我最喜歡的程式設計問題網站。您可能需要準備的 1-2 個月的訂閱費用是值得的。
有關程式碼演練,請參閱上面的 Nick White 和 FisherCoder 影片。
駭客排名
頂級編碼器
程式碼力量
科迪利
極客的極客
演算法專家
由 Google 工程師創建,這也是磨練技能的絕佳資源。
歐拉計劃
非常注重數學,不太適合程式設計面試
⬆ 回到頂部
好了,廢話不多說了,快來學習吧!
但在學習時不要忘記做上面的程式設計問題!
這裡無需執行任何操作,您只需觀看影片並做筆記即可!耶!
這裡有很多影片。只要看夠了,直到你理解為止。您可以隨時回來查看。
如果您不理解背後的所有數學原理,請不要擔心。
您只需要了解如何用 Big-O 來表達演算法的複雜性。
哈佛 CS50 - 漸近符號(影片)
大 O 符號(通用快速教學)(影片)
大 O 表示法(以及 Omega 和 Theta)- 最佳數學解釋(影片)
斯基納(影片)
加州大學柏克萊分校 Big O(影片)
攤銷分析(影片)
TopCoder(包括遞推關係式和主定理):
計算複雜度:第 1 節
計算複雜度:第 2 節
備忘錄
[複習] 18 分鐘分析演算法(播放清單)(影片)
嗯,差不多就這些了。
當你閱讀「破解編碼面試」時,有一章是關於此的,最後有一個測驗,看看你是否可以識別不同演算法的運行時複雜性。這是一次超級回顧和測試。
⬆ 回到頂部
在記憶體中是連續的,因此鄰近有助於提高效能
所需空間 = (陣列容量,>= n) * 項目大小,但即使是 2n,仍是 O(n)
O(1) 在末尾新增/刪除(為分配更多空間而攤提)、索引或更新
O(n) 在其他地方插入/刪除
練習使用陣列和指標以及指標數學進行編碼以跳到索引而不是使用索引。
已分配記憶體的新原始資料數組
size() - 項目數量
capacity() - 它可以容納的物品數量
is_empty()
at(index) - 傳回給定索引處的項目,如果索引超出範圍則爆炸
推(項目)
insert(index, item) - 在索引處插入項目,將該索引的值和尾隨元素向右移動
prepend(item) - 可以在索引 0 處使用上面的插入
pop() - 從末尾刪除,傳回值
delete(index) - 刪除索引處的項目,將所有尾隨元素向左移動
remove(item) - 尋找值並刪除儲存它的索引(即使在多個位置)
find(item) - 尋找值並傳回具有該值的第一個索引,如果找不到則傳回 -1
resize(new_capacity) // 私有函數
可以在底層分配 int 數組,但不要使用它的功能
從 16 開始,或如果起始數字較大,則使用 2 - 16、32、64、128 的冪
當達到容量時,將大小調整為兩倍
彈出項目時,如果大小為容量的 1/4,則將大小調整為一半
陣列 CS50 哈佛大學
數組(影片)
加州大學柏克萊分校 CS61B - 線性和多維陣列(影片)(從 15m 32s 開始觀看)
動態數組(影片)
鋸齒狀陣列(影片)
關於數組:
實現一個向量(具有自動調整大小的可變數組):
時間
空間
描述(影片)
無需實施
size() - 傳回清單中資料元素的數量
empty() - 如果為空則 bool 傳回 true
value_at(index) - 傳回第 n 個項目的值(第一個從 0 開始)
push_front(value) - 將一個項目加入到清單的前面
pop_front() - 刪除前面的項目並傳回其值
Push_back(value) - 在末尾新增一個項目
pop_back() - 刪除最終項目並傳回其值
front() - 取得前面項目的值
back() - 取得最終項目的值
insert(index, value) - 在索引處插入值,因此該索引處的目前項目由索引處的新項目指向
刪除(索引) - 刪除給定索引處的節點
value_n_from_end(n) - 傳回清單末尾第 n 個位置的節點的值
reverse() - 反轉列表
remove_value(value) - 刪除清單中具有該值的第一項
指針到指針
核心鍊錶與陣列(影片)
現實世界中的鍊錶與陣列(影片)
連結列表 CS50 哈佛大學 - 這構建了直覺。
單鍊錶(影片)
CS 61B - 連結列表 1(影片)
CS 61B - 連結列表 2(影片)
[複習] 4 分鐘連結清單(影片)
描述:
C 代碼(視頻)- 不是整個視頻,只是有關 Node 結構和內存分配的部分
鍊錶與陣列:
為什麼應該避免連結列表(影片)
問題:您需要指標到指標的知識:(因為當您將指標傳遞給可能會更改該指標指向的位址的函數時)此頁面只是為了掌握 ptr 到 ptr。我不推薦這種清單遍歷方式。可讀性和可維護性因聰明而受到損害。
實作(我使用尾指針和不使用):
雙向鍊錶
堆疊(影片)
[評論] 3 分鐘內堆疊(影片)
不會執行。使用數組實作很簡單
使用鍊錶的糟糕實現是,在頭部入隊並在尾部出隊的時間複雜度為 O(n),因為您需要倒數第二個元素,從而導致對每個出隊進行完全遍歷
入隊:O(1)(攤銷、鍊錶和陣列[探測])
出隊:O(1)(鍊錶和陣列)
空:O(1)(鍊錶和陣列)
enqueue(value) - 在可用儲存末端新增項目
dequeue() - 傳回值並刪除最近最少新增的元素
空的()
滿的()
enqueue(value) - 在尾部位置新增值
dequeue() - 傳回值並刪除最近最少新增的元素(前面)
空的()
隊列(影片)
循環緩衝器/先進先出
【回顧】3分鐘排隊(影片)
使用鍊錶實現,帶有尾指針:
使用固定大小的陣列實作:
成本:
hash(k, m) - m 是哈希表的大小
add(key, value) - 如果鍵已經存在,則更新值
存在(鍵)
取得(鍵)
刪除(鍵)
核心哈希表(影片)
資料結構(影片)
電話簿問題(視訊)
分散式哈希表:
Dropbox 中的即時上傳和儲存優化(影片)
分散式哈希表(影片)
哈希與鏈接(視頻)
卡普-拉賓桌加倍(影片)
開放尋址、加密雜湊(影片)
PyCon 2010:強大的字典(影片)
PyCon 2017:字典更強大(影片)
(高級)隨機化:通用和完美哈希(視頻)
(高級)完美哈希(視頻)
[複習] 4 分鐘雜湊表(影片)
影片:
線上課程:
使用線性探測透過數組實現
⬆ 回到頂部
二分查找(在已排序的整數數組上)
使用遞歸的二分查找
二分查找(影片)
二分查找(影片)
細節
藍圖
【複習】4分鐘二分查找(影片)
實施:
絕對整數
交換
計算位元組中位數的 4 種方法(影片)
計數位數
如何計算 32 位元整數中設定的位數
二進位:優點和缺點(為什麼我們使用二進位補碼)(影片)
1 補碼
2s 補碼
字
很好的介紹:位元操作(影片)
C 程式設計教學 2-10:位元運算子(影片)
位元操作
位元運算
比特駭客
比特擺弄者
Bit Twiddler 互動
位元黑客(視訊)
實踐操作
你應該知道 2 的許多冪,從 (2^1 到 2^16 和 2^32)
位元備忘錄
很好地理解使用以下方式操作位元:&、|、^、~、>>、<<
2 和 1 補碼
計數設定位
交換值:
絕對值:
⬆ 回到頂部
BFS注意事項:
DFS注意事項:
級別順序(BFS,使用隊列)
時間複雜度:O(n)
空間複雜度:最好:O(1),最差:O(n/2)=O(n)
時間複雜度:O(n)
空間複雜度:最佳:O(log n) - 平均值。最差樹的高度:O(n)
中序(DFS:左、自身、右)
後序(DFS:左、右、自身)
預購(DFS:自我、左、右)
樹木簡介(影片)
樹遍歷(影片)
BFS(廣度優先搜尋)和 DFS(深度優先搜尋)(影片)
[回顧] 4 分鐘廣度優先搜尋(影片)
【回顧】4分鐘深度優先搜尋(影片)
[評論] 11 分鐘內遍歷樹(播放清單)(影片)
insert // 將值插入樹中
get_node_count // 取得儲存值的計數
print_values // 列印樹中的值,從最小值到最大值
刪除樹
is_in_tree // 如果給定值存在於樹中則傳回 true
get_height // 傳回節點的高度(單一節點的高度為1)
get_min // 傳回樹中儲存的最小值
get_max // 傳回樹中儲存的最大值
is_binary_search_tree
刪除值
get_successor // 傳回給定值之後樹中的下一個最高值,如果沒有則回傳 -1
二元搜尋樹 - C/C++ 中的實作(影片)
BST 實作 - 堆疊和堆中的記憶體分配(影片)
在二元搜尋樹中尋找最小和最大元素(影片)
尋找二元樹的高度(影片)
二元樹遍歷 - 廣度優先和深度優先策略(影片)
二元樹:層序遍歷(影片)
二元樹遍歷:前序、中序、後序(影片)
檢查二元樹是否為二元搜尋樹(影片)
從二元搜尋樹中刪除節點(影片)
二元搜尋樹中的中序後繼(影片)
二元搜尋樹回顧(影片)
簡介(影片)
麻省理工學院(影片)
C/C++:
實施:
插入
sift_up - 插入所需
get_max - 傳回最大項目,而不刪除它
get_size() - 傳回儲存的元素數量
is_empty() - 如果堆不包含元素則傳回 true
extract_max - 傳回最大項,並將其刪除
sift_down - extract_max 需要
remove(x) - 刪除索引 x 處的項目
heapify - 從 heap_sort 所需的元素陣列建立堆
heap_sort() - 取得一個未排序的數組,並使用最大堆或最小堆將其轉換為已排序的數組
可視化為樹,但通常在儲存中是線性的(陣列、鍊錶)
堆疊
簡介(影片)
二元樹(影片)
樹高備註(影片)
基本操作(影片)
完整二叉樹(影片)
偽代碼(影片)
堆排序 - 跳到開始(影片)
堆排序(影片)
建構堆(影片)
MIT 6.006 演算法簡介:二元堆
CS 61B 第 24 講:優先權佇列(影片)
線性時間 BuildHeap(最大堆)
[評論] 13 分鐘內的堆(播放清單)(影片)
實現最大堆:
⬆ 回到頂部
筆記:
我不建議對鍊錶進行排序,但合併排序是可行的。
鍊錶的歸併排序
排序演算法穩定性
排序演算法的穩定性
排序演算法的穩定性
排序演算法 - 穩定性
沒有冒泡排序 - 這很糟糕 - O(n^2),除非 n <= 16
實施排序並了解最佳情況/最壞情況,每種情況的平均複雜度:
排序演算法的穩定性(“快速排序穩定嗎?”)
哪些演算法可以用於鍊錶?哪個在數組上?兩者中哪一個?
對於堆排序,請參閱上面的堆資料結構。堆排序很棒,但不穩定
Sedgewick - 合併排序(5 個影片)
1. 歸併排序
2.自下而上的歸併排序
3. 排序複雜度
4. 比較器
5.穩定性
Sedgewick - 快速排序(4 個影片)
1. 快速排序
2. 選型
3. 重複的鑰匙
4. 系統分類
加州大學柏克萊分校:
CS 61B 第 29 講:排序 I(影片)
CS 61B 第 30 講:排序 II(影片)
CS 61B 第 32 講:排序 III(影片)
CS 61B 第 33 講:排序 V(影片)
CS 61B 2014-04-21:基數排序(影片)
冒泡排序(影片)
分析冒泡排序(影片)
插入排序、合併排序(影片)
插入排序(影片)
合併排序(影片)
快速排序(影片)
選擇排序(影片)
合併排序代碼:
使用輸出數組 (C)
使用輸出數組 (Python)
就地 (C++)
快速排序代碼:
實施(C)
實施(C)
實作(Python)
【回顧】18分鐘排序(播放清單)
4 分鐘快速排序(影片)
4 分鐘內進行堆排序(影片)
3 分鐘內進行合併排序(影片)
2 分鐘內進行冒泡排序(影片)
3 分鐘內選擇排序(影片)
2 分鐘內插入排序(影片)
實施:
合併排序:O(n log n) 平均和最差