12.24 使用Python實現冒泡、選擇、插入基礎排序

冒泡排序

依次比較相鄰兩元素,若前一元素大於後一元素則交換之,直至最後一個元素即為最大;

然後重新從首元素開始重複同樣的操作,直至倒數第二個元素即為次大元素;

依次類推。如同水中的氣泡,依次將最大或最小元素氣泡浮出水面。

使用Python實現冒泡、選擇、插入基礎排序

實現

<code># 冒泡排序
def bubble_sort(li):
# 建立一個標識符
flag = False
for i in range(len(li)-1):
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
flag = True
# 如果沒進行交換,則本身有序,直接break
if not flag:
break
return li
/<code>

算法分析

  • 平均時間複雜度:O(n 2 ),標準的內外兩層循環
  • 最好時間複雜度:O(n),如果有序,那麼第一趟就ok了
  • 最壞時間複雜度:O(n 2 )
  • 空間複雜度:O(1)
  • 穩定性:穩定的

選擇排序

首先初始化最小元素索引值為首元素,依次遍歷待排序數列,若遇到小於該最小索引位置處的元素則刷新最小索引為該較小元素的位置,直至遇到尾元素,結束一次遍歷,並將最小索引處元素與首元素交換;

然後,初始化最小索引值為第二個待排序數列元素位置,同樣的操作,可得到數列第二個元素即為次小元素;以此類推。

使用Python實現冒泡、選擇、插入基礎排序

實現

<code># 選擇排序 O(n^2)
# 從第一個元素開始選擇最小的元素放在第一位,然後再選擇第二個元素
def select_sort(li):
for i in range(len(li)-1):
# 第i趟 無序區範圍i到最後
min_pos = i # 無序區最小值位置
for j in range(i+1, len(li)):
if li[j] < li[min_pos]:
min_pos = j
li[i], li[min_pos] = li[min_pos], li[i]
/<code>

算法分析

  • 平均時間複雜度:O(n 2 ),嵌套雙循環
  • 最好時間複雜度:O(n 2 ),每次要找最大最小肯定是要遍歷一遍的
  • 最壞時間複雜度:O(n 2 )
  • 空間複雜度:O(1)
  • 穩定性:穩定的

插入排序

將列表分為有序區和無序區兩個部分,最初有序區只有一個元素,即第一個元素。

然後每次從無序區選擇一個元素,插入到有序區中,直到無序區為空。

如下圖,橙色為有序區,淺藍色為無序區。

使用Python實現冒泡、選擇、插入基礎排序

實現

<code># 選擇排序 O(n2)
def insert_sort(li):
# i表示從下標1開始的數字, 第二個元素
for i in range(1, len(li)):
tmp = li[i]
j = i - 1
# 只要往後挪就循環

while j >= 0 and li[j] > tmp:
# 如果j = -1停止挪, 如果li[j]小於tmp停止挪
li[j + 1] = li[j]
j -= 1
# j位置在循環結束的時候要麼是-1要麼是比tmp小的值
li[j+1] = tmp
/<code>

算法分析

  • 平均時間複雜度:O(n 2 )
  • 最好時間複雜度:O(n),如果有序,那麼每個元素都已經在在它的待排子序列的合適位置,不用找合適位置
  • 最壞時間複雜度:O(n 2 )
  • 空間複雜度:O(1)
  • 穩定性:穩定的


分享到:


相關文章: