演算法學習(六)

2021-10-19 09:54:06 字數 3787 閱讀 3171

排序演算法:所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法

了解排序演算法原理(快速排序、歸併排序、插入排序、氣泡排序、選擇排序)及排序演算法的變種

1.先從數列中取出乙個數作為基準數。

2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。

3.再對左右區間重複第二步,直到各區間只有乙個數。

def quick_sort

(nums: list, l: int, r: int)

-> list: #l:

0 起始位置; r :

len(nums)

-1 末尾位置

"""快速排序"

""if l +

1>= r:

return #遞迴結束標誌

first = l #序列左邊在開始位置的由左向右移動的游標

last = r-

1 #序列右邊末尾位置的由右向左移動的游標

key = nums[first] #設定起始的基準元素

while first < last:

while first < last and nums[last]

>=key: # 如果first 與last 未重合,last

(右邊)指向的元素大於等於基準元素,則last 向左移動

last -=

1 nums[first]

= nums[last] #走到此位置時last指向乙個比基準元素小的元素,將last指向的元素放到first的位置上,此時last指向的位置空著,接下來移動first找到符合條件的元素放在此處

while first < last and nums[first]

<= key: #如果first與last未重合,first指向的元素比基準元素小,則first向右移動

first +=

1 nums[last]

= nums[first] # 此時first指向乙個比基準元素大的元素,將first指向的元素放到last空著的位置上,此時first指向的位置空著,之後進行下一次迴圈,將last找到符合條件的元素填到此處

# 退出迴圈後,first與last重合,此時所指位置為基準元素的正確位置,左邊的元素都比基準元素小,右邊的元素都比基準元素大

nums[first]

= key # 將基準元素放到該位置

#對基準元素左邊的子串行進行快速排序

quick_sort

(nums,l,first) # l:

0 first-

1 原基準元素靠左邊一位

# 對基準元素右邊的子串行進行快速排序

quick_sort

(nums,first+

1,r) #first+

1: 原基準元素靠右一位 r: 最後

首先歸併排序使用了二分法。給定乙個陣列,將其不停的分為左邊和右邊兩份,然後以此遞迴分下去。然後再將她們按照兩個有序陣列的樣子合併起來。

def merge_sort

(nums: list, l: int, r: int, temp:list)

-> list:

"""歸併排序"

""if l +

1>= r:

return #遞迴結束標誌

# 切分

mid = l +

(r -1)

//2merge_sort

(nums,l,mid,temp)

merge_sort

(nums,mid,r,temp)

#合併p,q,i = l,mid,l

while p < m or q < r:

if q >= r or

(p < m and nums[p]

<= nums[q]):

temp[i]

= nums[p]

i+=1 p+=

1else

: temp[i]

= nums[q]

i+=1 q+=

1for i in

range

(l,r)

: nums[i]

= temp[i]

插入排序的思想和我們打撲克摸牌的時候一樣,從牌堆裡一張一張摸起來的牌都是亂序的,我們會把摸起來的牌插入到左手中合適的位置,讓左手中的牌時刻保持乙個有序的狀態。

def insert_sort

(self, nums: list)

-> list:

"""插入排序"

""for i in

range(1

,len

(nums)):

key = nums[i]

for j in

range(1

,i+1)[

::-1

]:if j>

0 and key < nums[j-1]

: nums[j]

= nums[j-

1]

nums[j-1]

= key

return param

氣泡排序就是遍歷資料,每次只與下乙個數字比較,如果這兩個數順序不對,則與交換過來。

def bublle_sort

(nums: list)

-> list:

"""氣泡排序"

"" n =

len(nums)

for j in

range

(n-1):

count =

0for i in

range(0

, n-

1-j)

: #從頭走到尾

if nums[i]

>nums[i+1]

: nums[i]

,nums[i+1]

= nums[i+1]

,nums[i]

count +=1if

0== count:

break

return nums

選擇排序是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置。

def selection_sort

(nums: list)

-> list:

"""選擇排序"

"" # 第一層for表示迴圈選擇的遍數

for i in

range

(len

(nums)-1

):# 將起始元素設為最小元素

min_index = i

# 第二層for表示最小元素和後面的元素逐個比較

for j in

range

(i +1,

len(nums)):

if nums[j]

< arr[min_index]

: # 如果當前元素比最小元素小,則把當前元素角標記為最小元素角標

min_index = j

# 查詢一遍後將最小元素與起始元素互換

nums[min_index]

, nums[i]

= nums[i]

, nums[min_index]

return arr

演算法學習筆記六 dp

題目描述 在乙個n n的矩陣中,每個格仔都有乙個整數,pipi位於矩陣的左上角,它想知道有多少條不同合法路線達到矩陣右下角。行走規則如下 1 每次只能往下或往右走一步。2 格仔中的整數表示從該點出發一步必須跨越的距離。ps 對 1 和 2 條件的解釋 若此時在 x,y 並且格仔上的數字為 k 則下一...

演算法學習 Union Find演算法

union find演算法有它的實際用途。多用於動態連通的應用場景。union find演算法是 給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的 舉兩個例子作為主要表現 1 在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候...

演算法學習 KM演算法

km演算法 用於求二分圖的最佳完美匹配 即權值最大的完美匹配 如果你也是個剛來學習km演算法的人 大概的用途肯定還是知道的吧 還是直接說重點吧 首先 理解km演算法前 必須有以下3個概念 1.可行頂標 對於乙個賦值二分圖g x,y,e,w x,y 代表二分圖的兩邊頂點標號 e代表邊 w代表邊的權值 ...