2. 二叉樹
3. 鍊錶反轉
def
quick_sort
(li, start, end)
:# 分治 一分為二
# start=end ,證明要處理的資料只有乙個
# start>end ,證明右邊沒有資料
if start >= end:
return
# 定義兩個游標,分別指向0和末尾位置
left = start
right = end
# 把0位置的資料,認為是中間值
mid = li[left]
while left < right:
# 讓右邊游標往左移動,目的是找到小於mid的值,放到left游標位置
while left < right and li[right]
>= mid:
right -=
1 li[left]
= li[right]
# 讓左邊游標往右移動,目的是找到大於mid的值,放到right游標位置
while left < right and li[left]
< mid:
left +=
1 li[right]
= li[left]
# while結束後,把mid放到中間位置,left=right
li[left]
= mid
# 遞迴處理左邊的資料
quick_sort(li, start, left-1)
# 遞迴處理右邊的資料
quick_sort(li, left+
1, end)
if __name__ ==
'__main__'
: l =[6
,5,4
,3,2
,1]# l = 3 [2,1,5,6,5,4]
# [2, 1, 5, 6, 5, 4]
quick_sort(l,0,
len(l)-1
)print
(l)# 穩定性:不穩定
# 最優時間複雜度:o(nlogn)
# 最壞時間複雜度:o(n^2)
def
heapify
(arr, n, i)
: largest = i
l =2* i +
1# left = 2*i + 1
r =2* i +
2# right = 2*i + 2
if l < n and arr[i]
< arr[l]
: largest = l
if r < n and arr[largest]
< arr[r]
: largest = r
if largest != i:
arr[i]
,arr[largest]
= arr[largest]
,arr[i]
# 交換
heapify(arr, n, largest)
defheapsort
(arr)
: n =
len(arr)
# build a maxheap.
for i in
range
(n,-1,
-1):
heapify(arr, n, i)
# 乙個個交換元素
for i in
range
(n-1,0
,-1)
: arr[i]
, arr[0]
= arr[0]
, arr[i]
# 交換
heapify(arr, i,
0)
def
levelorder
(root)
: res,queue=
,[root]
ifnot root:
return res
while queue:
node=queue.pop(0)
if node.left:
if node.right:
return res
#前序遍歷
defpreorder
(root)
: res=
ifnot root:
return
none
preorder(root.left)
preorder(root.right)
return res
#中序遍歷
definorder
(root)
: res=
ifnot root:
return res
inorder(root.left)
inorder(root.right)
return res
#後序遍歷
deflastorder
(root)
: res=
ifnot root:
return res
lastorder(root.left)
lastorder(root.right)
return res
#非遞迴前序
defpreorder
(root)
: res,stack=
,[root]
ifnot root:
return res
while stack:
node=stack.pop(
)if node.right:
if node.left:
return res
#非遞迴中序
definorder
(root)
: stack=
node=root
res=
while stack or node:
while node:
node=node.left
node=stack.pop(
) node=node.right
return res
#非遞迴後序
deflastorder
(root)
: res=
ifnot root:
return
none
stack=
[root]
while stack:
node=stack.pop(
)if node.left:
if node.right:
return res[::
-1]
class
solution
:def
reverselist
(self, head: listnode)
-> listnode:
''' p,rev=head,none
while p:
rev,rev.next,p=p,rev,p.next
return rev
'''ifnot head or
not head.
next
:return head
pre=
none
while head:
tmp=head.
next
head.
next
=pre
pre=head
head=tmp
return pre
#遞迴方法
ifnot head or
not head.
next
:return head
new_node=self.reverselist(head.
next
) head.
next
.next
=head
head.
next
=none
return new_head
演算法 基本資料結構
1 後進先出 2 棧有乙個屬性為s.top執行最新插入的元素 3 彈出稱為pop,插入稱為push 4 上溢和下溢 如果試圖對乙個空棧執行彈出操作,則稱為下溢 如果s.top超過了n,則稱為上溢,在下面偽 中不考慮上溢問題 1 先進先出 2 佇列有對頭head和對尾tail 3 插入稱為入隊 enq...
php 基本資料結構 和 演算法
以下的格式不好看,或者到空間的 裡面看吧,那裡的格式規範些。希望對有需要的同學有點幫助吧 基本資料結構 二分查詢 有序陣列裡查詢某個元素 low為待查詢的陣列中的最小值,high為陣列中的最大值,k為要查詢的關鍵字 function bin sch array,low,high,k elseif k...
演算法學習 基本資料結構
資料型別 數值型別 函式定義 介面 注 定義乙個返回多值得函式 使用指標 cartesian coordinates to polar coordinates polar float x,float y,float r,float theta 案例 厄拉多塞篩 問題描述 定義乙個陣列array n ...