排序演算法之選擇排序 插入排序 氣泡排序 歸併排序

2021-10-06 22:40:10 字數 1888 閱讀 2708

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 思路 將第乙個元素與剩餘所有元素相比,如果有比第...