氣泡排序 通俗易懂

2021-10-17 04:26:31 字數 2283 閱讀 5989

氣泡排序是一種簡單的排序演算法,它也是一種穩定排序演算法。其實現原理是重複走訪過要排序的元素列,依次比較兩個相鄰的元素,如果當該對元素順序不正確時進行交換過來。一直重複這個過程,直到沒有任何兩個相鄰元素可以交換,就表明完成了排序。

注意: 一般情況下,稱某個排序演算法穩定;指的是當待排序序列中有相同的元素時,

它們的相對位置在排序前後不會發生改變。

假設待排序序列為 (9,4,1,2),如果採用氣泡排序對其進行公升序(由小到大)排序,此時不考慮時間複雜度,有多少個元素就進行多少輪排序,則整個排序過程如下所示:

第一輪排序,此時對整個序列中的元素依次掃瞄每對相鄰的元素,並對順序不正確的元素對交換位置,整個過程如圖 1 所示。

從圖 1 可以看到,經過第一輪氣泡排序,從序列中找出了最大數 9,並將其放到了序列的尾部。

第二輪排序,此時依舊整個序列中的元素依次掃瞄每對相鄰的元素,並對順序不正確的元素對交換位置,整個過程如圖 2所示。

從圖2中可以看到,經過第二輪氣泡排序,從序列中找出了第二大數4,並將其放到了序列的倒數第二個位置。

第三輪排序,此時依舊整個序列中的元素依次掃瞄每對相鄰的元素,並對順序不正確的元素對交換位置,整個過程如圖 3所示。

從圖3中可以看到,經過第三輪氣泡排序,從序列中找出了第三大數2,並將其放到了序列的第二個位置。

第四輪排序,此時依舊整個序列中的元素依次掃瞄每對相鄰的元素,並對順序不正確的元素對交換位置,整個過程如圖 4所示。

從圖4中可以看到,經過第四輪氣泡排序,從序列中找出了第四大數1,並將其放到了序列的頭部。

原始的氣泡排序是穩定的,由於該排序演算法的每一輪都要遍歷一遍所有的元素,輪轉的次數和元素數量相當,所以時間複雜度為o(n^2)。簡單來說,陣列裡面有多少個元素就進行多少輪的排序,每一輪都依次比較相鄰元素,最後就得到我們想要的排序序列。

相應的**如下:

public

class

test

;mysort

(arr)

; system.out.

println

("公升序:");

for(

int x:arr)

}public

static

void

mysort

(int

arr)}}

}}

執行結果為:

仔細觀察我們就會發現,上面的**還是可以稍微改進一下,提高**的執行效率;首先不管有多少個元素,排序的輪次等於元素的個數減一;上面4個元素,進行4輪排序時,陣列內容已經是有序的了,因為經過三輪的排序,陣列裡面已經有三個元素來到了陣列的尾部並且是有序的;如果再進行第4輪排序就屬於多餘的操作。其次,每一輪比較的次數應該為元素的個數減一再減去第幾輪;第一輪時:每個元素都要進行比較,所以比較的次數為:arr.length-1-i,因為i從0開始,所以次數為三;第二輪時:i=1,此時的次數為二,因為經過第一輪的排序,已經找出了最大的乙個元素並且放到了陣列最後,如果再進行比較也屬於多餘操作。另外在排序某些陣列時進行幾輪排序陣列就已經是我們想要的序列了,針對這種情況我們可以定義乙個標記,來終止排序。

經過分析改進的**如下:

public

class

test

;mysort

(arr)

; system.out.

println

("公升序:");

for(

int x:arr)

}public

static

void

mysort

(int

arr)}if

(a==

true)}

}}

字典排序演算法(通俗易懂)

我們先看乙個例子。示例 1 2 3的全排列如下 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 我們這裡是通過字典序法找出來的。那麼什麼是字典序法呢?從上面的全排列也可以看出來了,從左往右依次增大,對這就是字典序法。可是如何用演算法來實現字典序法全排列呢?你主要看紅色字型部分...

numpy bincount 通俗易懂

bincount的用途很簡單,就是統計出乙個列表的各個元素的出現次數。例如輸入是 1,0,2,2,1,2,3,5 那麼輸出就是 1,2,3,1,0,1 這樣的結果可能並不是很直觀,可能依然會有同學會問為什麼會輸出這樣的結果。我們看看 假如我們把輸入的列表中的數字都統計一遍,形成乙個字典 key是列表...

通俗易懂的C STL

泛型程式設計 generic programming 是一種語言機制,通過它可以實現乙個標準的容器庫。像類一樣,泛型也是一種抽象資料型別,但是泛型不屬於物件導向,它是物件導向的補充和發展。泛型程式設計在c 上的應用主要體現在兩方面 函式模板和類模板。接下來舉個栗子 csdn部落格 anyway,模板...