基於比較氣泡排序 時間複雜度O n 2

2021-10-05 03:13:53 字數 1175 閱讀 4279

只操作相鄰的兩個資料,每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求,如果不滿足讓它兩互換。一次冒泡會讓至少乙個元素移動到它應該在的位置,重複 n 次,就完成了 n 個資料的排序工作。

eg:對於一組資料 4、5、6、3、2、1
第一次冒泡的過程:經過了 5 次比較,此時 3 已經在正確的位置了,即每一次冒泡在至少有乙個位置會調整到最終的位置,對於 6 個資料最多 6 次冒泡完成所有排序

六次冒泡後的結果:其實這個是可以優化。當某次冒泡操作已經沒有資料交換時候,說明已經達到完全有序,不需要執行後續的冒泡操作。

優化:由於 n 個資料完成排序的次數是小於等於 n 的,所以當在小於 n 次可以完成,那麼再冒泡就會多餘。所以可以設定乙個標誌位,當某次冒泡掃瞄完所有的數後沒有發生資料交換說明此時已經排好,直接跳出即可。

詳細**:

//氣泡排序,n表示陣列大小

public

void

bubblesort

(int

arr,

int n)

for(

int i =

0; i < n; i++)}

if(flag ==

false)}

}

小結:

是原地排序演算法嗎?

只涉及相鄰資料交換操作,只需要常量級臨時空間,所以它的空間複雜度為o(1),是乙個原地排序法。

穩定性在氣泡排序中,只有交換才可以改變兩個元素的前後順序,為了保證氣泡排序演算法的穩定性,當有相鄰兩個元素膽小相等的時候不做交換,相同大小的資料在排序前後不會改變順序所以是穩定的。

時間複雜度

最好情況:要排序的資料已經是有序的,只需要進行一次冒泡操作,o(n)

最壞情況:是倒序 如果6 個數就要 6 次冒泡。 o(n^2)

平均時間複雜度: o(n^2)

氣泡排序 時間複雜度與空間複雜度

外迴圈是遍歷每個元素,每次都放置好乙個元素 內迴圈是比較相鄰的兩個元素,把大的元素交換到後面 等到第一步中迴圈好了以後也就說明全部元素排序好了 實現 include 列印陣列元素 void print array int array,int length printf n n void bubble...

基於比較的快速排序 時間複雜度為O nlogn

快速排序 快排利用的是分治思想。如果要排序陣列中下標從 p 到 r 之間的一組資料,選擇p 到 r 之間的任意乙個資料作為分割槽點pivot。遍歷 p 到 r 之間的資料,將小於pivot的放到左邊,將大於pivot的放到右邊,將pivot放到中間。經過這一步驟後陣列 p 到 r 之間的資料就被分為...

基於比較的插入排序 時間複雜度O n 2

直接插入排序 insert sort 將陣列中的資料分為兩個區域,已排序區間和未排序區間。初始已排序區間只有乙個元素,就是陣列的第乙個元素。插入演算法的核心思想就是取未排序區間中的元素,在已排序區間中從後往前找到最合適的位置將其插入,並保證已排序區間資料一直有序,重複這個過程,直到未排序區間中元素未...