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