1. 選擇排序
基本原理:對於給定的一組記錄,第一輪選擇最小(大)值,與第一條記錄進行交換。然後從剩餘元素中,找出最小(大)值,與第二條記錄進行交換,知道記錄中未排序元素個數為0.該演算法時間複雜度為o(n^2)
def sort_quickly(data):
n = len(data)
for i in range(n):
tmp = i
for j in range(i+1, n):
if data[tmp] > data[j]:
tmp = j
max = data[tmp]
data[tmp] = data[i]
data[i] = max
print(data)
2. 插入排序
基本原理: 將乙個記錄插入到已經排好序的有序表中,從而乙個新的、記錄數增1的有序表.該演算法最好時間複雜度為o(n),最壞為o(n^2).
def sort_insert(data):
n = len(data)
for i in range(1, n):
tmp = data[i]
j = i - 1
while j >= 0:
if data[j] > tmp:
data[j+1] = data[j]
data[j] = tmp
j -= 1
print(data)
3. 氣泡排序
基本原理:比較相鄰的元素,根據比較結果就交換個。 對每一對相鄰元素做同樣的工作,第一輪比較結果為:第n個元素最大(小)的數。 針對n-1個元素重複以上的步驟,直到沒有任何一對數字需要比較。該演算法最好時間複雜度為o(n),最壞為o(n^2).
def sort_bubble(data):
n = len(data)
i = n
while i >= 1:
for j in range(i-1):
if data[j] > data[j+1]:
tmp = data[j+1]
data[j+1] = data[j]
data[j] = tmp
i -= 1
print(data)
4. 歸併排序
基本原理:利用分治思想將數字序列劃分,,對子表進行排序,然後利用遞迴操作合併子表。時間複雜度o(nlogn).
def merge(left, right):
l_l = len(left)
l_r = len(right)
i = 0
j = 0
result =
while i < l_l and j < l_r:
if left[i] > right[j]:
j += 1
else:
i += 1
result += left[i:]
result += right[j:]
print(result)
return result
def merge_sort(data):
n = len(data)
if n <= 1:
return data
num = n // 2
left = merge_sort(data[:num])
right = merge_sort(data[num:])
return merge(left, right)
if __name__ == '__main__':
lists = [3, 4, 2, 8, 9, 5, 1]
merge_sort(lists)
排序演算法之「選擇排序 氣泡排序 插入排序」
上午上課老師通過兩個神似的三角形,講了氣泡排序和選擇排序的區別和聯絡在 恰好下午看到了這樣的一寫關於該排序演算法的一些資料,想了想還是決定試一試,因為出來混總是要還的。就是使一串記錄,按照其中某個或者某個關鍵字的大小,遞增或遞減的排列起來的演算法。它應用在大量資料處理方面,乙個優秀的演算法可以節省大...
排序演算法之 氣泡排序,插入排序,選擇排序
顧名思義 小的數一點一點向前冒,最終有序 時間複雜度 o n 2 public static void bubblesort int arr for int i arr.length 1 i 0 i public static void swap int arr,int i,int j 基本思想 每...
《演算法》選擇排序 插入排序 氣泡排序
選擇排序,演算法 p156 package algorithm public class selection p156 for int i 0 i n i public static void main string args test.sort a 思路 將第乙個元素與剩餘所有元素相比,如果有比第...