def
bubble_sort
(arry)
: n =
len(arry)
#獲得陣列的長度
for i in
range
(n):
for j in
range(1
,n-i)
:if arry[j-1]
> arry[j]
:#如果前者比後者大
arry[j-1]
,arry[j]
= arry[j]
,arry[j-1]
#則交換兩者
return arry
def
select_sort
(ary)
: n =
len(ary)
for i in
range(0
,n):
min= i #最小元素下標標記
for j in
range
(i+1
,n):
if ary[j]
< ary[
min]
:min
= j #找到最小值的下標
ary[
min]
,ary[i]
= ary[i]
,ary[
min]
#交換兩者
return ary
def
insert_sort
(ary)
: n =
len(ary)
for i in
range(1
,n):
if ary[i]
< ary[i-1]
: temp = ary[i]
index = i #待插入的下標
for j in
range
(i-1,-
1,-1
):#從i-1 迴圈到 0 (包括0)
if ary[j]
> temp :
ary[j+1]
= ary[j]
index = j #記錄待插入下標
else
:break
ary[index]
= temp
return ary
def
shell_sort
(ary)
: n =
len(ary)
gap =
round
(n/2
)#初始步長 , 用round四捨五入取整
while gap >0:
for i in
range
(gap,n)
:#每一列進行插入排序 , 從gap 到 n-1
temp = ary[i]
j = i
while
( j >= gap and ary[j-gap]
> temp )
:#插入排序
ary[j]
= ary[j-gap]
j = j - gap
ary[j]
= temp
gap =
round
(gap/2)
#重新設定步長
return ary
def
merge_sort
(ary):if
len(ary)
<=1:
return ary
num =
int(
len(ary)/2
)#二分分解
left = merge_sort(ary[
:num]
) right = merge_sort(ary[num:])
return merge(left,right)
#合併陣列
defmerge
(left,right)
:'''合併操作,
將兩個有序陣列left和right合併成乙個大的有序陣列'''
l,r =0,
0#left與right陣列的下標指標
result =
while l<
len(left)
and r<
len(right)
:if left[l]
< right[r]:)
l +=
1else:)
r +=
1 result += left[l:
] result += right[r:
]return result
def
quick_sort
(ary)
:return qsort(ary,0,
len(ary)-1
)def
qsort
(ary,left,right)
:#快排函式,ary為待排序陣列,left為待排序的左邊界,right為右邊界
if left >= right :
return ary
key = ary[left]
#取最左邊的為基準數
lp = left #左指標
rp = right #右指標
while lp < rp :
while ary[rp]
>= key and lp < rp :
rp -=
1while ary[lp]
<= key and lp < rp :
lp +=
1 ary[lp]
,ary[rp]
= ary[rp]
,ary[lp]
ary[left]
,ary[lp]
= ary[lp]
,ary[left]
qsort(ary,left,lp-1)
qsort(ary,rp+
1,right)
return ary
def
heap_sort
(ary)
: n =
len(ary)
first =
int(n/2-
1)#最後乙個非葉子節點
for start in
range
(first,-1
,-1)
:#構造大根堆
max_heapify(ary,start,n-1)
for end in
range
(n-1,0
,-1)
:#堆排,將大根堆轉換成有序陣列
ary[end]
,ary[0]
= ary[0]
,ary[end]
max_heapify(ary,
0,end-1)
return ary
#最大堆調整:將堆的末端子節點作調整,使得子節點永遠小於父節點
#start為當前需要調整最大堆的位置,end為調整邊界
defmax_heapify
(ary,start,end)
: root = start
while
true
: child = root*2+
1#調整節點的子節點
if child > end :
break
if child+
1<= end and ary[child]
< ary[child+1]
: child = child+
1#取較大的子節點
if ary[root]
< ary[child]
:#較大的子節點成為父節點
ary[root]
,ary[child]
= ary[child]
,ary[root]
#交換 root = child
else
:break
python 實現常見排序演算法
coding utf 8 bubble sort 氣泡排序 時間複雜度最壞為o n2 最優的為n import time def bubble sort alist 氣泡排序 param alist return cur 1 while cur len alist 1 and len alist 1...
常見排序演算法Python實現
氣泡排序 最優時間複雜度 o n 最壞時間複雜度 o n 2 穩定性 穩定 def bubble sort alist 氣泡排序 for j in range len alist 1,0,1 count 0 for i in range j if alist i alist i 1 alist i ...
常見排序演算法 python實現
穩定性是指序列中相同的數字在排序後相對位置不發生改變 常見的且穩定的排序演算法有冒泡 歸併 插入,其餘的為非穩定的排序演算法 def bubble sort alist for j in range len alist 1 0,1 for i in range j if alist i alist ...