算法图解第四章笔记与习题(快速排序)
算法圖解第四章筆記與習題(快速排序)
文章目錄
- 算法圖解第四章筆記與習題(快速排序)
- 4.1 分而治之
- 4.2 快速排序
- 4.3 大$O$表示法的平均情況和最糟情況
- 4.4 小結
- 練習
- 習題4.1
- 習題4.2
- 習題4.3
- 習題4.4
- 使用大O表示法時,下面各種操作都需要多長時間?
- 習題4.5
- 習題4.6
- 習題4.7
- 習題4.8
4.1 分而治之
分而治之(divide and conquer)D&G是一種著名的遞歸式問題解決方法。——分而治之是遞歸的。
分而治之的算法是遞歸的。使用分而治之算法解決問題的過程包括兩個步驟。
(1)找出基線條件,這種條件必須盡可能接單。
(2)不斷地將問題分解(或者說縮小規模),直到使其符合基線條件。
例如,對于數組類問題的基線條件,則常常是數組為空,或數組內僅有一個元素。分解方式則通常是將其分為兩個盡可能等大小的數組。
4.2 快速排序
def quicksort(array):if len(array) < 2: # 基線條件:為空或只包含一個元素的數組是“有序”的return arrayelse: # 遞歸條件pivot = array[0] # 選定數組中的第一個值為基準值less = [i for i in array[1:] if i <= pivot] # 得到比基準值小的數字組成的數組greater = [i for i in array[1:] if i > pivot] # 得到比基準值大的數字組成的數組return quicksort(less) + [pivot] + quicksort(greater) # 將子數組進行快速排序,再與基準值一同組成有序數組。print(quicksort([10, 5, 2, 3]))4.3 大OOO表示法的平均情況和最糟情況
-
最糟情況指的是算法運行時可能遇到的最壞的情況。
-
平均情況指的是算法遇到時的最佳情況。(最佳情況也是平均情況)
快速排序的平均情況為O(nlog?n)O(n\log n)O(nlogn),最糟情況為O(n2)O(n^2)O(n2)。這取決于基準值選取的好壞。
當每次基準值選取的均為最差情況時,則需要對包含nnn個元素的數組進行nnn次基準值的選取。當每次基準這選取的均為最佳情況時,則僅需要log?n\log nlogn次選取。(二分)
而當每一次選取基準值后,數組的每個元素均需要和基準值進行對比,因此,每次選取基準值之后需要進行nnn次比較。
因此,快速排序的最糟情況為O(n?n)=O(n2)O(n* n)=O(n^2)O(n?n)=O(n2),平均情況為O(nlog?n)O(n\log n)O(nlogn)。
4.4 小結
- 分而治之算法將問題逐步分解。使用分而治之算法處理列表時,基線條件很可能是空數組或只包含一個元素的數組。
- 實現快速排序時,請隨機地選擇用作基準值的元素。快速排序的平均運行時間為O(nlog?n)O(n \log n)O(nlogn)。
- 大OOO表示法中的常量有時候事關重大,這就是快速排序比合并排序快的原因所在。
- 比較簡單查找和二分查找時,常量幾乎無關緊要,因為列表很長時,O(log?n)O(\log n)O(logn)的速度比O(n)O(n)O(n)快得多。
練習
習題4.1
- 請編寫前述sum函數的代碼。(遞歸求和,基線條件為數組空)
習題4.2
- 編寫一個遞歸函數來計算列表包含的元素數。
上面兩題中,數組內只有一個元素的情況均可省略。因為數組只有一個元素——即剩余數組為空的情況,已經被基線條件包含了,因此可以省略。
習題4.3
- 找出列表中最大的數字。
習題4.4
- 還記得第1章介紹的二分查找嗎?它也是一種分而治之算法。你能 找出二分查找算法的基線條件和遞歸條件嗎?
基線條件:數組中僅剩一個元素(是否為查找元素為另外的判斷,不屬于基線條件之內)
遞歸條件:將數組分為兩部分,如果查找值比第一部分的最大值小,則對第一部分繼續二分查找,否則對剩余部分進行二分查找。
使用大O表示法時,下面各種操作都需要多長時間?
習題4.5
- 打印數組中每個元素的值。
每個元素進行一次打印操作。$O(n) $。
習題4.6
- 將數組中每個元素的值都乘以2。
n個元素進行一次乘法操作。故為O(n)O(n)O(n) 。
習題4.7
- 只將數組中第一個元素的值乘以2。
O(1)O(1)O(1)。
習題4.8
- 根據數組包含的元素創建一個乘法表,即如果數組為[2, 3, 7, 8, 10],首先將每個元素 都乘以2,再將每個元素都乘以3,然后將每個元素都乘以7,以此類推。
n個元素做n次乘法操作。故為O(n2)O(n^2)O(n2) 。
總結
以上是生活随笔為你收集整理的算法图解第四章笔记与习题(快速排序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做移动端视频通话软件,大致看了下现有的开
- 下一篇: U-Boot 移植