應用場景:
求乙個問題最優解,且該問題可分解為若干子問題,子問題還能再分為子問題且每個子問題都存在最優解(整個問題的最優解依賴於各個子問題的最優解)
從上向下分析問題,從下向上求解問題(解決最小問題開始,並且把已經解決的子問題的最優解儲存下來)(面試題通常儲存在一維或二維陣列裡),然後把子問題最優解組合起來解決大的問題
劍指offer中partition函式思路:
1.在start, end區間隨機選擇乙個數字的索引,並將該索引的數字放置於陣列data最後
2.游標small初始化指向start之前
3.for迴圈每次向後移動游標index:
如果data[index] < data[end],則small後移一位(游標small始終指向小於data[end]的數字);
如果data[index] < data[end],則直接跳過,開始下次迴圈,並在找到data[index] < data[end]時將small後移一位,然後交換此時data[small]和data[index]的值(即始終保證游標small指向小於data[end]的數字,或small後移一位指向大於data[end]的數字時,立即交換data[small]和data[index])
4.遍歷完陣列結束迴圈後,交換data[small]和data[end],最後使得步驟1隨機選中的數字的左邊均為小於它的數字,右邊均為大於它的數字
資料結構總結:
【遞迴】
某函式執行過程中呼叫自身,一直執行到最後得到乙個返回再返回給上一級函式繼續執行,逐次向前返回並完成上一級函式的執行過程
【下圖有助於理解遞迴的過程】
【氣泡排序】:每次從第乙個元素開始,比較當前元素和next元素大小(將大的放到next位置),一輪操作後,max移至尾部,再從頭部開始重複上述工作
時間複雜度:
最優時間複雜度:o(n) (表示遍歷一次發現沒有任何可以交換的元素,排序結束。)
最壞時間複雜度:o(n^2)(逆序表,需要比較
【選擇排序】:【每次從右邊選出min放到左邊最後】將序列分為兩部分,關注後面序列,每次從中選出最小的放到前面序列的尾部
【直接插入排序】:將序列分為兩部分,關注前面序列,每次選出後面序列的第乙個元素插入到前面序列的正確位置
【希爾排序】增加gap版插入排序, 通常(非數學策略),每次gap//2(首次 gap = n//2
【快速排序】(必須掌握)
兩個游標low和high,二者所指的元素和想要找到正確位置的元素(mid_value)比較,將小的放mid_value左邊,大的放mid_value右邊
【快速排序具體操作】先移動high/low,如果high所指元素小於mid_value,則該元素與low所指元素交換位置,然後向右移動low,如果low元素大於mid_value,則該元素與high交換位置,再左移high
【快速排序最優時間複雜度】:nlogn理解(每次移動n步(列表長度),每次列表分一半,分到最後每批只有乙個元素停止,即2222.。。=n(n除以多少次2等於1),則分的次數為logn, 乘積nlogn)
【快速排序最壞時間複雜度】:n2,每次只能分成一部分(自己和其他元素,則需要n次,每次n步,即nn)
【歸併排序】按中軸線分為一半,每次都分為一半,左右兩組指標(left_pointer和right_pointer)分別比較組成一組順序排列,再和另外一組重複同樣操作
【歸併排序最優/最壞時間複雜度】每次都是除以二操作,最優和最壞情況相同,每一級為n,共需要logn次操作,共nlogn
【排序穩定性】
氣泡排序因為每次比較不會跳過任何乙個元素,不會打亂相對順序;
快速排序會跳過元素,很可能打亂原有順序
歸併排序 通過寫**實現 左和右分別比較,左邊<=右邊時就先放左邊,可以實現穩定(但空間複雜度為o(n),得到乙個新的序列,與原序列長度相同)
【常見排序演算法效率比較】
【二分查詢】
分為遞迴版本和非遞迴版本:
類似於查字典,先取idx=(首+末)/2的元素與item比較,若item小,則取前半部分繼續比較【:mid】,若item大,則取後半部分【mid+1:】,直到查詢所有元素沒有後返回false
【二分查詢時間複雜度】用到了下標,操作物件只能是順序表
最優o(1), 最壞o(logn):每次對半
樹樹新增節點:模擬佇列(列表實現),每次操作彈出隊首元素,依次判斷各節點有無左右節點,如有則新增至隊尾,如無則將新節點加於此
廣度遍歷(層次遍歷):按每層的順序依次數即可
【深度遍歷】(必會):
樹的構造和新增節點不會寫可以,根據遍歷方式寫出列印資料必會
先序遍歷(根左右),中序遍歷(左根右),後序遍歷(左右根)
其中先、中、後均指根相對左右子節點的位置, 左右先後順序保持不變
經典排序演算法總結
排序演算法是離散數學和資料結構學科最基本的演算法,雖然知道這些排序演算法的名字,但是一直沒有研究過它們的實現原理。現在把它們收集起來,並一一親自實現,來加深對排序演算法的理解。1,氣泡排序 最簡單的排序演算法,從第乙個元素開始比較相鄰元素大小,如果前邊元素大於後邊元素則交換位置,否則將下標移到下乙個...
經典排序演算法總結
插入排序 選擇排序 歸併排序 排序方法 平均情況 最好最差 空間複雜度 穩定性氣泡排序o n2 o n 2 o n o n o n2 o n 2 o 1 o 1 穩定快速排序o nlogn o nlog n o nlogn o nlog n o n2 o n 2 o nlogn o nlog n 不...
排序演算法個人總結
最近在看演算法,自然而然地就看到了排序。下面記錄一下自己的學習過程。一 歸併排序 首先我說說我理解的歸併演算法的核心 歸即將陣列中分為小部分的集合,其中也即數成為區域性有序的集合。然後再將這些有序陣列合併起來。歸 一般以中點劃分,不斷地遞迴,以使陣列有序,其實歸和並是互動的。如8個數字,歸為4,4。...