排序演算法:所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法
了解排序演算法原理(快速排序、歸併排序、插入排序、氣泡排序、選擇排序)及排序演算法的變種
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代表邊的權值 ...