資料結構與演算法 排序 氣泡排序

2021-10-09 09:10:46 字數 2839 閱讀 6214

今天來學一下十大排序

首先,我們先了解下各個排序的時間複雜度:

冒泡、選擇、插入、歸併、快速、希爾、堆排序屬於比較排序

在這裡,我們預設排序是從小到大排序。

乙個動態演示各種排序演算法的動畫**:visualgo

如果相等的兩個元素,在排序前後的相對位置保持不變,那麼這個演算法是穩定的排序演算法。

比如 5 1 3a 4 7 3b

穩定排序:1 3a 3b 4 5 7

不穩定排序:1 3b 3a 4 5 7

對於自定義物件,穩定、不穩定排序還是有很大影響的。

官方點的語言:

執行流程:

1 從頭開始比較每一對相鄰元素,如果第1個比第2個大,就交換它們的位置。執行完一輪後,最末尾那個元素就是最大的元素。

2 忽略1中曾經找到的最大元素,重複執行步驟1,直到全部元素有序。

首先,我們考慮,如何兩兩比較,將最大值找到並放在最末尾。

public

class

sort

;for

(int begin =

1; begin < array.length; begin++)}

for(

int i =

0; i

}

以上,是一次迴圈後,找出最大值,放入最後面。

後面,我們需要繼續迴圈除去最後乙個值的剩餘元素,找出最大值,放在新的迴圈的最末尾。

然後,考慮比較時,

第1次比較的末尾索引值是array.length - 1

第2次比較的末尾索引值是array.length - 2

第3次比較的末尾索引值是array.length - 3

第k次比較的末尾索引值是array.length - k

第0個位置與第0個位置,不需要比較

也就是最後的末尾值是1

也就是end的取值範圍是1 到 array.length - 1

因而,不難寫出**:

public

class

sort

;for

(int end = array.length -

1; end >

0; end--)}

}for

(int i =

0; i

}

當然,之前自己這樣寫過氣泡排序:

第一種寫法,在begin、end上變數名取的好,比直接使用i,j好理解

第一種寫法,基本上按照了氣泡排序的思路直接寫出來的

第二種寫法,手寫的時候好寫,寫法也好看,i,j都從0開始,並且都是++操作。不像第一種寫法,第一層迴圈–,第二層++。

不過,還是第一種思路上好理解。

對於上面的氣泡排序,迴圈兩遍,很容易看出其時間複雜度為o(n^2)

假如,給我們的陣列本身就是有序的,如果用之前的**,程式會按部就班的執行,時間複雜度還是o(n^2)。但事實上,如果陣列本身就是有序的,我們就不需要進行氣泡排序演算法,直接列印出結果即可。也就是,我們可以對上述**做優化

如果序列已經完全有序,可以提前終止氣泡排序

定義乙個變數sorted,如果從begin到end比較一遍,發現從頭到尾沒有發生交換,說明陣列是有序的。然後end–,數量變小,依然是有序的,所以,可以直接結束迴圈。

比如 1 2 3 4 6 5

第一次迴圈過後,就是有序的,1 2 3 4 5 6

第二次迴圈,發現是有序的,直接結束列印。

public

class

sort

;for

(int end = array.length -

1; end >

0; end--)}

if(sorted)

}for

(int i =

0; i

}

這個效率,一般來說,優化過後的執行時長要比沒有優化的原生**時長要長。

畢竟,優化的**,裡面多了三行**。

優化過後的氣泡排序,適用於待排序陣列,接近有序的時候。

如果序列已經區域性有序,可以記錄最後一次交換的位置,減少比較次數

//既然sortedindex已經有了,那麼,下次結束的時候,就是最後交換的位置

end = sortedindex;

}for

(int i =

0; i

}最壞時間複雜度o(n^2),1 + 2 +3 + … + n-1

最好時間複雜度,只需要遍歷一遍o(n)

空間複雜度,不需要借助其他空間o(1)

可以發現,第二個優化方案還是很有效果的。

資料結構與演算法 排序 氣泡排序

兩兩相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。氣泡排序基本概念是 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟 首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此...

資料結構與演算法 氣泡排序

氣泡排序的思想是,從前往後 或從後往前 掃瞄,每找乙個逆序對,就將它更正過來,這樣每一輪總可以找到乙個最大值或最小值。1 從前往後掃瞄,每次找到的較大值插入到後面,第一層迴圈代表當前插入位置。public static void sinksort int nums,int start,int end...

資料結構與演算法 氣泡排序

氣泡排序是一種穩定排序演算法,因為排序過程每次都把其中最大的數或者最小的數上移直至頂端,因此叫氣泡排序。排序過程 依次交換相鄰的兩個數 第一次選出最大的數,第二次選出第二大的數,依次進行,直至n 1個數字置,最後乙個數不用排。複雜度 o n 實現 include using namespace st...