排序演算法(1) 氣泡排序和插入排序

2021-08-15 02:56:44 字數 2346 閱讀 1262

氣泡排序需要多次遍歷列表。它比較相鄰的項並交換那些無序的項。每次遍歷列表將下乙個最大的值放在其正確的位置。實質上,每個項「冒泡」到它所屬的位置。

用python寫交換操作時,與大多數程式語言略有不同(需要臨時儲存位置),python可以執行同時賦值,語句 a,b = b,a 兩個賦值語句同時完成。

下圖展現了氣泡排序的第一次遍歷:

用python實現氣泡排序的**如下:

氣泡排序通常被認為是最低效的排序方法,因為它必須在最終位置被知道之前交換項。 這些「浪費」的交換操作是非常昂貴的。 然而,因為氣泡排序遍歷列表的整個未排序部分,它有能力做大多數排序演算法不能做的事情。特別地,如果在遍歷期間沒有交換,則我們知道該列表已排序。 如果發現列表已排序,可以修改氣泡排序提前停止。這意味著對於只需要遍歷幾次列表,氣泡排序具有識別排序列表和停止的優點。

在原來的氣泡排序基礎上設定exchange,初始值設定為true。只要某趟氣泡排序有交換,則exchange在迴圈中為true,否則為false,停止冒泡。

短氣泡排序**如下:

def

shortbubblesort

(alist):

exchanges = true

passnum = len(alist)-1

while passnum > 0

and exchanges:

exchanges = false

for i in range(passnum):

if alist[i]>alist[i+1]:

exchanges = true

alist[i], alist[i+1] = alist[i+1], alist[i]

passnum = passnum-1

alist=[20,30,40,90,50,60,70,80,100,110]

shortbubblesort(alist)

print(alist)

始終在列表的較低位置維護乙個排序的子列表。然後將每個新項 「插入」 回先前的子列表,使得排序的子列表稱為較大的乙個項。其過程如下圖所示:

我們開始假設有乙個項(位置 0 )的列表已經被排序。在每次遍歷時,對於每個項 1至 n-1,將針對已經排序的子列表中的項檢查當前項。當我們回顧已經排序的子列表時,我們將那些更大的項移動到右邊。 當我們到達較小的項或子列表的末尾時,可以插入當前項。如下圖所示:

python實現**如下:

def

insertionsort

(alist):

for index in range(1,len(alist)):

currentvalue = alist[index]

position = index

while position>0

and alist[position-1]>currentvalue:

alist[position]=alist[position-1]

position = position-1

alist[position]=currentvalue

alist = [54,26,93,17,77,31,44,55,20]

insertionsort(alist)

print(alist)

關於移位和交換的乙個注意事項也很重要。通常,移位操作只需要交換大約三分之一的處理工作,因為僅執行一次分配。在基準研究中,插入排序有非常好的效能。

參考資料:《problem-solving-with-algorithms-and-data-structure-using-python》

排序演算法 氣泡排序 插入排序

氣泡排序 步驟1 從第乙個元素開始與它的下乙個元素比較,如果比下乙個元素大,交換兩個元素的位置 如果小於或者相等,保持不變。每次交換可以保證有序的佇列長度增加1。步驟2 重複步驟1,一直到整個佇列全部有序為止。比如對於序列5,4,3,2,1,經過第一次交換後佇列改變為 4,3,2,1,5 第二次交換...

《演算法》選擇排序 插入排序 氣泡排序

選擇排序,演算法 p156 package algorithm public class selection p156 for int i 0 i n i public static void main string args test.sort a 思路 將第乙個元素與剩餘所有元素相比,如果有比第...

排序演算法 氣泡排序 選擇排序 插入排序

氣泡排序演算法 氣泡排序是最簡單的排序演算法之一。此演算法具有二次方程增長階,因此僅適合排序小列表。氣泡排序演算法是階o n 2 的演算法 package com.szy.structure.sort public class bubblesort system.out.println 排序前 fo...