#氣泡排序
#最優時間複雜度:o(n) (表示遍歷一次發現沒有任何可以交換的元素,排序結束。)
#最壞時間複雜度:o(n2)
defbubble_sort(alist):
for j in range(len(alist)-1, 0, -1):
for i in
range(j):
if alist[i]]:
alist[i], alist[i+1] = alist[i+1], alist[i]
#選擇排序:
#最優時間複雜度:o(n2)
#最壞時間複雜度:o(n2)
defselection_sort(alist):
#首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,
#然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。
#以此類推,直到所有元素均排序完畢。
n =len(alist)
#需要進行n-1次選擇操作
for i in range(n-1):
min_index =i
#從i+1位置到末尾選擇出最小資料
for j in range(i+1, n):
#比較第min_index個元素 和 後面的i+1到n的元素
if alist[j] min_index =j
#此時後面的元素已經換了嗎?我們還需要確定一下這次走後面i+1到n的選擇(其實就是後面的換沒換對)的最小
#值是否在交換的當前的min_index值,如果兩個相等就不需要交換
if min_index !=i:
#因為min_index不是我們換之前的index,而是在後面i+1到n的選擇,所以需要交換min_index的值(index索引)肯定是大於i
alist[i], alist[min_index] =alist[min_index], alist[i]
#插入排序
#插入排序在實現上,在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。
definsert_sort(alist):
#從第二個位置,即下標為1的元素開始向前插入
for i in range(1, len(alist)):
#從第i個元素開始向前比較,如果小於前乙個元素,交換位置
for j in range(i, 0, -1):
if alist[j] < alist[j - 1]:
alist[j], alist[j - 1] = alist[j - 1], alist[j]
#快速排序
#最優時間複雜度:o(nlogn) 最壞時間複雜度:o(n2)
#通過一趟排序將要排序的資料分割成獨立的兩部分,
#其中一部分的所有資料都比另外一部分的所有資料都要小,
#然後再按此方法對這兩部分資料分別進行快速排序,
#整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
defquick_sort(alist,start,end):
if start >=end:
return
#設定起始元素為要尋找位置的基準元素;分開兩邊
mid =alist[start]
#low為序列左邊的由左向右移動的游標
low =start
#high為序列右邊的由右向左移動的游標
high =end
while low #如果low與high未重合,high指向的元素不比基準元素小,則high向左移動
while low < high and alist[high] >=mid:
high -= 1
#將high指向的元素放到low的位置上
alist[low] =alist[high]
#如果low與high未重合,low指向的元素比基準元素小,則low向右移動
while low < high and alist[low] low += 1
#將low指向的元素放到high的位置上
alist[high] =alist[low]
#退出迴圈後,low與high重合,此時所指位置為基準元素的正確位置
#將基準元素放到該位置,效果一樣
#alist[low] = mid
alist[high] =mid
#對基準元素左邊的子串行進行快速排序
quick_sort(alist, start, low - 1)
#對基準元素右邊的子串行進行快速排序
quick_sort(alist, low + 1, end)
#希爾排序
#將陣列列在乙個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列(步長更長了,列數更少了)來進行。
defshell_sort(alist):
n =len(alist)
gap = n/2
while gap >0:
#按步長進行插入排序
for i in
range(gap,n):
j =i
#插入排序
while j >= gap and alist[j - gap] >alist[j]:
alist[j - gap], alist[j] = alist[j], alist[j -gap]
j -=gap
#得到新的步長
gap = gap / 2
#歸併排序,歸併排序的思想就是先遞迴分解陣列,再合併陣列。
#最優時間複雜度:o(nlogn)
#最壞時間複雜度:o(nlogn)
#將陣列分解最小之後,然後合併兩個有序陣列,
#基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。
#然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。
defmerge_sort(alist):
if len(alist) <= 1:
return
alist
#二分分解
num = len(alist)//2left =merge_sort(alist[:num])
right =merge_sort(alist[num:])
#合併return
merge(left, right)
defmerge(left, right):
#'''合併操作,將兩個有序陣列left和right合併成乙個大的有序陣列'''
#left與right的下標指標
l, r =0, 0
result =
while land rif left[l] l += 1
else
: r += 1result +=left[l:]
result +=right[r:]
return
result
alist = [54,26,93,17,77,31,44,55,20]
sorted_alist =merge_sort(alist)
print(sorted_alist)
Python資料結構 排序
簡單排序 冒泡 交換 排序 選擇排序 插入排序 希爾排序 複雜排序 快速排序 堆積排序 基數排序 合併排序 合併兩個或多個排好序的線性表 穩定排序與不穩定排序 穩定排序是指一串數字,進過排列以後,同樣大小的元素保持原有的順序。不穩定排序就是說,排序後,同樣大小的元素的順序可能發生改變。例如 排序前有...
Python資料結構之排序
def bubble sort li 氣泡排序 for j in range len li 1 0,1 每次遍歷需要比較的次數,逐漸減小 for i in range 0 j 比較相鄰兩數,大的放右邊 if li i li i 1 li i li i 1 li i 1 li i def select...
資料結構 氣泡排序(Python)
氣泡排序 英語 bubble sort 是一種簡單的排序演算法。它重複地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。氣泡排序演算...