氣泡排序 選擇排序 插入排序

2022-07-25 06:12:08 字數 2683 閱讀 5173

在開始這三種演算法的學習之前,我們要先來補給幾個知識:

時間複雜度

時間複雜度:用來評估演算法執行效率的乙個式子

時間複雜度-小結:

快速地判斷演算法複雜度:

簡單情況:

複雜情況:根據演算法執行過程判斷

穩定性:

相同值的情況下,排序完兩個值的相對位置不會發生變化。

演算法描述

比較相鄰的兩個元素,如果第乙個比第二個大,就交換他們兩個的位置。(每一趟都會冒出乙個有序區的數。)

**

**實現

def bubble_sort(li):

# 第一層迴圈幾趟

# len - 1,因為氣泡排序最後一趟的數字已經是最大的了,無需要再走一趟。

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

# 第二層迴圈,

# - i:在無序區中比較兩個數的大小,每一趟結束之後會產生乙個有序數字

# - 1:最後乙個數字無須遍歷,因為在第j次(倒數第二個數字)已經與j+1(倒數第乙個數字)次進行了比較

exchange = false

for j in range(len(li) - i - 1):

if li[j+1] < li[j]: # 公升序

li[j+1], li[j] = li[j], li[j+1]

exchange = true

# 如果標誌位沒有變化,則說明這一趟中數字位置沒有發生變化(即已經有序了),後面的趟沒必要比較了

if not exchange:

return

li = [1, 2, 5, 3, 4, 6, 9, 8, 7]

bubble_sort(li)

print(li)

小結:演算法描述每一趟選擇乙個數放在第一位,然後後面每個數都與這個數進行比較,如果比第一位數小的話就替換掉第乙個數,然後後面的數再和新的最小值比較,一趟完成過後有序區產生乙個有序數字,然後每一趟都迴圈無序區中的數字。

**演示

**演示

def select_sort(nums):

# 因為遍歷了n-1次之後 最後乙個值肯定是最大的了,無序再遍歷

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

min_pos = i # 當前遍歷目標位置

# i後面所有的數都和 目標位置的數值進行比較

for j in range(i + 1, len(nums)):

if nums[j] < nums[min_pos]:

min_pos = j

nums[min_pos], nums[i] = nums[i], nums[min_pos]

return nums

小結:演算法描述它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置插入。

實現思路:

從第乙個元素開始,該元素可以認為已經被排序;

取出下乙個元素,在已經排序的元素序列從後向前掃瞄

如果該元素大於新元素,則該元素移動到下一位置。

**演示

**實現

def insert_sort(nums):

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

temp = nums[i] # 要插入的值

j = i - 1 # j為有序區中最大的值

while j >= 0 and nums[j] > temp: # 有序區中 所有比temp大的值全部往右移動

nums[j + 1] = nums[j]

j -= 1

nums[j + 1] = temp

return nums

小結:

氣泡排序,選擇排序,插入排序

氣泡排序,選擇排序,插入排序 小規模的檔案以及基本有序的檔案,插入排序的效能比快速排序的效能更為有效一些,實際上,插入排序通常也做快速排序實現的一部分。1 氣泡排序 packagedatastrut public classbubblesort public voidinsert longvalue...

選擇排序 , 插入排序 , 氣泡排序

編寫 include void println int array,int len 列印給定長度的陣列 printf n void swap int array,int i,int j 交換陣列中兩個位置的元素 void selectionsort int array,int len o n n 對...

氣泡排序 插入排序 選擇排序

氣泡排序是每輪比較未排序部分,從第乙個元素開始找最值,比較相鄰數字,依次往後推移,最終將最值置於最右。假設有n個數,外迴圈迴圈n 1遍,內迴圈是n 1在減去當前是第幾次外迴圈。void bubble sort mytype a,int n n為陣列長度 插入排序是從第二個元素開始快取,然後向前比較,...