本文從冒泡排序撩起,對選擇、插入、希爾、歸並、快排6種經典的數組排序進行了深入分析,並詳解其間的關聯,讓你深刻理解其中的關鍵點;同時對經典的數據結構Vector、Stack、Queue、樹、Map、Set做了歸納總結,對其底層的實現做了解析,分享給大家,作為每一個中高級程序員應該懂得的算法與排序,祝大家早上走上自己的“成金之路”。
目錄:
1.排序算法
2.數據結構
3.資料參考
1.排序算法:
a.起源:
計算機從誕生起,就在模擬人這種智能生物的行為,而排序也來自於日常生活中,最經典的冒泡排序即來源於水泡從水底升上水面,離水面越近,水泡體積越大——由此誕生的冒泡排序思想即為:依次遍歷每個元素,如果前一個比后一個大,則交換兩者的位置。
其缺點有二:第一點每次比較都會產生交換元素的行為,效率低;第二點,算法復雜度為O(n^2)
b.針對缺點一的優化:
選擇排序:即每次遍歷只記錄最大元素的下標,最后進行元素交換;
插入排序:當輸入有序程度較高時,通過構建有序數組,並將新元素插入到有序數組中,完成整體的排序,降低元素交互的次數,缺點是不穩定;
希爾排序:插入排序穩定穩定程度太低,因此通過主動構建有序對(間隔n、n/2、n/4...1的有序對),來提升“插入排序”的穩定性,是插入排序的一種改進。
c.針對缺點二的優化:
歸並排序:采用“分治算法思想”,將輸入一分為二,分別排序,通過“並行”思想來提升算法效率,復雜度為O(nlgn),但是需要額外的arr[n]空間,來進行合並;
快速排序:對歸並排序的改進,在不需要額外空間的情況下,對數組遍歷,按對選定元素的比較進行划分,小的集中在左邊,大的集中在右邊;分別對兩邊進行排序——整體的思路與構建二叉樹一致,其復雜度為O(nlgn)。
d.偽代碼總結如下:




2.數據結構:
教學視頻參考斯坦福公開課《抽象編程》,地址為
http://open.163.com/special/opencourse/abstractions.html
這里對主要的數據結構進行了拆解,如下圖


上圖只是詳解了其底層的結構,但是涉及到使用時,還需要提供一些常見接口,供調用者使用,如size()、iterator()/hasnext()/next()x、add()/remove()、contain()、isEmpty()等;見
代碼實現分享
鏈接:http://pan.baidu.com/s/1hsoReNa 密碼:h9q0。
另,
附上《抽象編程》總結筆記,
鏈接:http://pan.baidu.com/s/1jI6xZtc 密碼:4ik0,希望大家對數據接口及常見的排序有個更深層次的認識,編程時不僅僅會用,還要體會其底層實現,以最高效的方式,來完成程序,走上自己的“成金之路”;另,轉載請注明出處(百度搜“成金之路 博客園”)。
請不吝“推薦”。
3.參考資料: