在開始這三種演算法的學習之前,我們要先來補給幾個知識:
時間複雜度
時間複雜度:用來評估演算法執行效率的乙個式子
時間複雜度-小結:
快速地判斷演算法複雜度:
簡單情況:
複雜情況:根據演算法執行過程判斷
穩定性:
相同值的情況下,排序完兩個值的相對位置不會發生變化。
演算法描述
比較相鄰的兩個元素,如果第乙個比第二個大,就交換他們兩個的位置。(每一趟都會冒出乙個有序區的數。)
**
**實現
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為陣列長度 插入排序是從第二個元素開始快取,然後向前比較,...