04 第四章 快速排序(分而治之)

2021-10-05 17:28:40 字數 2635 閱讀 7231

本章內容:

目錄

分而治之

快速排序

再談大o表示法

分而治之並非可用於解決問題的演算法,而是一種解決思路。

使用分而治之策略解決問題的過程包括兩個步驟:

找出基線條件,這種條件必須盡可能簡單。不斷將問題分解(或者說是減小規模),直到符合基線條件

例項一:

比如編寫求解乙個數字陣列之和的函式

第一步,找到基線條件。最簡單的陣列應該是不包含元素或者是只包含乙個元素,這個就是基線條件。

第二步,縮小規模。如何將乙個陣列縮小規模,可以每一次都從陣列中提取乙個數字,然後將這個數字和剩下的陣列進行求和,這樣陣列的規模便可以縮小。採用遞迴的手段,因此每一次呼叫,都會離基線條件更近一步。

def sum(arr):

if arr == :

#基線條件

return 0

else:

number = arr.pop()

newarr = arr

return number+sum(newarr)

print(sum([1,2,3,4]))

例項二:

比如有一塊土地,你要將這塊地均勻分成方塊,且分出來的方塊盡可能的大

第一步,找到基線條件。最容易的處理情況是,一邊的長度是第二條邊的整數倍

第二步,縮小規模。比如現在是一大塊方地(1680*640)那麼可以將其劃分為兩個(640*640)的正方形以及乙個(640*400)的矩形,那麼那塊(640*400)的便是縮小規模後的土地,依次類推。

(歐幾里得演算法:適用這小塊地的最大方塊,也是適用於整塊地的最大方塊。哈哈哈記住這個便可以了。對於這乙個過程最好還是畫一下圖,對每一步的過程都畫一畫)

def find_min_squre(a,b):

#假設現在那塊地其中一邊長a,另外一邊長b

x = max(a,b)

y = min(a,b)

#找出兩條邊中較長邊和短邊

if x == 2*y:

return y

#要是符合基線條件那麼直接輸出最小邊,即為可切最大正方形的邊長

else:

return find_min_squre(x%y,y)

#這個x%y的意思是求出原來的長方形切去若干個正方形後剩下的長度

print(find_min_squre(1680,640))

輸出結果是80

快速排序是一種常用的排序演算法,比選擇排序快很多。例如,c語言中標準庫中的函式qsort實現的就是快速排序。快速排序也是使用的是分而治之的方法。下面使用快速排序對陣列進行排序。

基線條件:

陣列為空或者是只包含乙個元素。在這種情況下,只需返回原陣列——根本不需要排序。

縮小規模:

需要將陣列進行分解,直至達到基線條件。要是有多個元素,首先從陣列中選擇乙個元素,這個元素稱之為基準值(pivot)。接下來,找出比這個基準值小的元素以及比這個基準值大的元素,這個被稱為分割槽(pratitioning)。

此時則會有:

基準值乙個由所有小於基準值的元素構成的乙個子陣列

乙個由所有大於基準值的元素構成的乙個子陣列

這個裡面的子陣列是無序的。

若是這兩個字陣列都是有序的,那麼是不是

原來的陣列排序 = 其中乙個有序的子陣列 + 基準值 + 另外乙個有序的子陣列

其實,很容易就可以想到了,這兩個無序的子陣列變成有序的子陣列也是採用相同的方法,即取出基準值然後分成兩個子陣列,分而治之。比如找個例子,有個陣列 [4,5,2,7,1,3] 要採用這個方法進行排序。

這裡用從大到小的方式排列,也就是把大的陣列放在左邊

[4,5,2,7,1,3] 

[5,7] + 4 + [2,1,3]

( [7] + 5 + [ ] )+ 4 +( [3] + 1 + [1] )

def quicksort(arr):

if len(arr) < 2:

return arr

else:

pivot = arr[0]

smaller = [i for i in arr[1:] if i <= pivot]

bigger = [i for i in arr[1:] if i > pivot]

return quicksort(smaller) + [pivot] + quicksort(bigger)

print(quicksort([4,5,2,7,1,3]))

輸出結果為   [1, 2, 3, 4, 5, 7]

快速排序的獨特之處在於選擇的基準值,快速排序的平均時間為 o(n*log n)。一般情況下,直接隨機取基準值就好。

常見的大o運算時間

演算法二分查詢

簡單查詢

快速排序

選擇排序

旅行商問題演算法

快 --> 慢

o(log n)

o(n)

o(n*log n)

o(log n*n)

o(log n!)

筆記 第四章 04

數學期望 期望 均值 離散型 連續型 隨機變數的分布函式 理解為符合函式求期望值 方差 e,記做d x var x 其開放稱作標準差 均方差,其在資料上的表現為d x 越小,則資料越集中 方差和期望的關係 e e x 2 e x 2 切比雪夫不等式 通過已知的e x 和d x 估計某一區間的時間的概...

第四章,排序檢索資料

order by 列名 select prod name from products order by prod name輸出以prod name字母順序排列的資料 order by 排序參照列也可以是非選擇的列 order by 列名1,列名2先按照列1排序,在列1相同時,再按照列2排序 desc...

第四章 繼承

一 為什麼要繼承 在物件導向中我們將具有很多重複內容的類中的內容提取出來,寫成乙個單獨的類 其他類只需要繼承就能取得這些功能,同時可以在自己類中寫入獨特的自定義方法 二 繼承語法 inte ce circle nsobject 繼承是在介面中定義的 冒號後的類名是要整合的類,nsobject 是co...