更新中 ...
穩定性:排完序後,所有等值元素的相對位置保持不變適應性:排序演算法對順序不同的待排序序列,表現出差異性(越有序,越高效)
平均時間複雜度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 只...