各種排序演算法

2021-09-07 03:09:13 字數 3012 閱讀 9156

更新中 ...

穩定性:排完序後,所有等值元素的相對位置保持不變

適應性:排序演算法對順序不同的待排序序列,表現出差異性(越有序,越高效)

平均時間複雜度o(n^2),最好o(1)

原地排序,空間複雜度為o(1)

原理:從序列最左側開始遍歷,用該元素首先比較其相鄰的左側元素(左側已排好),若該元素比其小,則左側元素右移,繼續比較該元素和左側第二個的大小(注意,比較的是該元素temp和list[j-1],非list[j]和list[j-1])...直至找到正確位置。

def insert(lst):

for i in range(1,len(lst)):

temp=lst[i]

j=iwhile j>0 and lst[j-1]>temp:

lst[j]=lst[j-1]

j-=1

lst[j]=temp

return lst

平均時間複雜度o(n^2),最好o(1)

原地排序,空間複雜度為o(1)

原理:通過交換元素消除逆序實現排序。發現相鄰的逆序對就進行交換,通過反覆比較和交換完成排序。(每次都能保證把最大元素移到未排序部分的最後,所以每次未排序部分都減少一位j in range(1,len(lst) - i )

def bubble(lst):

for i in range(len(lst)):

for j in range(1,len(lst)-i):

if lst[j-1]>lst[j]:

lst[j],lst[j-1]=lst[j-1],lst[j]

return lst

平均時間複雜度o(n^2),所有情況都是o(n^2),比較總次數1+2+3+...+n-1=n *(n - 1) / 2

原地排序,空間複雜度為o(1)

原理:每次從剩餘未排序的子串行中選擇出最小的,放入左側已排序子串行的後面

def ******select(lst):

for i in range(len(lst)-1):

k=ifor j in range(i+1,len(lst)):

if lst[j]時間複雜度:o(n log n) 歸併的遍數不多於:log n  +1, 每次歸併做得比較次數是 n

空間複雜度: o(n),需要乙個與原序列長度相等的序列,然後兩個交錯使用進行歸併

原理:將長度為n的序列,分成n個子序列,兩兩歸併子串行(有序子串行長度加倍),重複操作得到長度為n的有序序列

def mergesort(seq):

if len(seq) <= 1:

return seq

#定義內部兩兩合併函式

def merge(left, right):

result = # 新的已排序好的列表

i = 0 # 下標

j = 0

# 對兩個列表中的元素 兩兩對比。

# 將最小的元素,放到result中,並對當前列表下標加1

while i < len(left) and j < len(right):

if left[i] <= right[j]:

i += 1

else:

j += 1

result += right[j:]

return result

mid = len(seq) // 2

left = mergesort(seq[:mid]) #遞迴

right = mergesort(seq[mid:])

return merge(left, right)

#或者將中間合併函式merge簡化為:

def merge(left, right):

result =

while left and right:

if left:

result+=left

if right:

result+=right

return result

測試:

input_list = [6, 4, 8, 9, 2, 3, 1,-1]

print('排序前:', input_list)

sorted_list = mergesort(input_list)

print('排序後:', sorted_list)

result:

排序前: [6, 4, 8, 9, 2, 3, 1, -1]

排序後: [-1, 1, 2, 3, 4, 6, 8, 9]

時間複雜度:最好o(nlogn),最壞o(n^2)

空間複雜度:o(logn)

原理:每次選擇乙個基準元素,兩個指標從頭和尾分別遍歷,先從尾開始遍歷,一直找到小於base的,然後復值給頭,然後頭指標向後遍歷,找到大於base的,賦值給尾指標。最後將base賦值給頭指標,然後遞迴處理左右兩邊子陣列。

def quick_sort(s,l,r):

if l>=r: return

i=lj=r

base=s[i]

while i=base: #右邊開始找小於base的元素

j-=1

s[i]=s[j]

while ii+=1

s[j]=s[i]

s[i]=base #最後s[i]是空的,base賦值

quick_sort(s,l,i-1) #遞迴處理左右兩邊的子陣列

quick_sort(s,j+1,r)

return s

排序 各種排序演算法

每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子表中適當位置,直到全部記錄插入完成為止 待排序的記錄放在陣列r 0,n 1 中 排序過程中將r分成兩個子區間,有序區r 0,i 1 無序區r i,n 1 將當前無序區的第1個記錄,插入到有序區中適當的位置上 每次是有序區增加乙個記錄,知道...

各種排序演算法

交換函式 void swap int a,int b 氣泡排序 氣泡排序 bubble sort,台灣譯為 泡沫排序或氣泡排序 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排...

各種排序演算法

include include include using namespace std void swap int a,int b void output int a,int n 直接插入排序 時間複雜度o n 2 void insertsort int a,int n 折半插入排序 o n 2 只...