python資料結構 排序

2022-07-07 18:36:13 字數 3535 閱讀 4246

#

氣泡排序

#最優時間複雜度: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 是一種簡單的排序演算法。它重複地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。氣泡排序演算...