排序演算法的穩定性
穩定性:穩定排序演算法會讓原本有相等鍵值的紀錄維持相對次序。
假設以下的數對將要以他們的第乙個數字來排序。
(4, 1) (3, 1) (3, 7)(5, 6)
在這個狀況下,有可能產生兩種不同的結果,乙個是讓相等鍵值的紀錄維持相對的次序,而另外乙個則沒有:
(3, 1) (3, 7) (4, 1) (5, 6) (維持次序)
(3, 7) (3, 1) (4, 1) (5, 6) (次序被改變)
那麼低乙個就是穩定的,第二個就是不穩定的
def bubble_sort(alist):
for j in range(len(alist)-1,0,-1):
# j表示每次遍歷需要比較的次數
for i in range(j):
if alist[i]>alist[i+1]:
alist[i],alist[i+1]=alist[i+1],alist[i]
li = [54,26,93,17,77,31,44,55,20]
bubble_sort(li)
print(li)
輸出
[17, 20, 26, 31, 44, 54, 55, 77, 93]
def selection_sort(alist):
n=len(alist)
for i in range(n-1):
#i代表將要選擇第i個位置的元素
min_index=i
for j in range(i+1,n):
#j代表本次選擇從第j個開始
if alist[min_index]>alist[j]:
min_index=j
if min_index!=i:
alist[min_index],alist[i]=alist[i],alist[min_index]
alist = [54,226,93,17,77,31,44,55,20]
selection_sort(alist)
print(alist)
輸出結果:
[17, 20, 31, 44, 54, 55, 77, 93, 226]
def insert_sort(alist):
for i in range(1,len(alist)):
#i是指每次插入需要比較的次數
for j in range(i-1,0,-1):
#j是指從第j個向前比較,一直比較到第0個
if alist[j]輸出
[17, 26, 31, 44, 54, 55, 77, 93, 20]
希爾排序是一種高階的快速排序,每次排序的元素是列表中以某個數為間隔的子列表
def shell_sort(arr):
n=len(arr)
gap=n//2
##從乙個比較大的gap開始,然後縮小gap
while gap>0:
#以gap為間隙進行插入排序,arr[0...gap-1]已經在即將被插入的序列中
#每次新增乙個元素進行以此gap的插入排序,直到最後乙個元素
for i in range(gap,n):
temp=arr[i]
#臨時儲存arr[i],將arr[i]新增到合適的位置
j=iwhile j-gap>=0 and arr[j-gap]>temp:
arr[j]=arr[j-gap]
j-=gap
#一直將比temp大的元素移動到arr[j+gap]上
arr[j]=temp
gap=gap//2
alist = [6,10,1,3,5,11,2,14]
shell_sort(alist)
print(alist)
[1, 2, 3, 5, 6, 10, 11, 14]
def quick_sort(arr,start,end):
if start>=end:
return
#退出迴圈的條件
mid=arr[start]
low=start
high=end
while lowmid:
high-=1
# 將high指向的元素放到low的位置上
arr[low]=arr[high]
# 如果low與high未重合,low指向的元素比基準元素小,則low向右移動
遞迴方式
def binary_search(arr,item):
if len(arr)==0:
return
else:
mid=len(arr)//2
if arr[mid]==item:
return true
else:
if item非遞迴方式:
def binary_search(arr,item):
l=0r=len(arr)-1
while l<=r:
mid=(l+r)//2
if arr[mid]==item:
return true
elif item
r=mid-1
else:
l=mid+1
return false
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binary_search(testlist, 3))
print(binary_search(testlist, 13))
false
true
資料結構第五天
1.氣泡排序 氣泡排序重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢 浮 到數列的頂端,故名。步驟 比較相鄰的元素。如果第乙個比第二個大,就交...
資料結構 第五天 佇列
只允許在一端進行插入操作,而在另一端進行刪除操作的線性表,即是一種先進先出 fifo 的線性表。抽象資料型別 adt 佇列 queue data 元素具有相同的型別,相鄰的元素具有前驅和後繼的關係 operation initqueue q 初始化操作,建立乙個空佇列q destroyqueue q...
Python學習第五天
1 關於print,使用print方法列印多個表示式也是可行的 print age 12 age 12 2 別名,如果需要引用的方法名出現重複時可以使用別名 from math import sqrt as foobar 3 多個賦值操作可以同時進行 x,y,z 1,2,3 print x,y,z ...