冒泡演算法的優化

2021-06-12 07:21:53 字數 1611 閱讀 6612

冒泡演算法的主要思想:

氣泡排序和插入排序相類似,都是簡單的排序演算法 ,時間複雜度o(n^2)

演算法思想:

1) 有n個數(存放在陣列a[0]-a[n-1]中),第一趟將每相鄰兩個數比較,小的換到前面,經n-1次兩兩相鄰比較後,最大的數已經「沉底」,放到最後的乙個位置,小數上公升「浮起」

2) 第二趟對餘下的n-1個數(最大的數已經「沉底」),按上法比較,經n-2次兩兩比較之後得次大的數

3) 依此推算,n個數共進行n-1趟比較,在第j趟中要進行n-j次兩兩比較

演算法實現**:

[c-sharp]view plain

copy

void

betterbubble(

intarray,

intsize)  

}  }  

}    

問題:

但如果只是這樣單純實現方法,會有些浪費。即如果一些陣列,它進行過幾趟之後,就已經完全排好序了,但根據這個還要繼續在進行排序,這樣會非常浪費。

如1,2,3,4,5,6,7,8,9,10,進行一趟排序之後就已經拍好序,但程式還要在進行多趟排序

解決方案:

在進行一趟比較排序之後,馬上就判斷一下這個陣列是否已經排好序了,如果已經排好了,那就直接退出。

[c-sharp]view plain

copy

void

betterbubble(

intarray,

intsize)  

}  if

(issorted(array,size))  

break

;  }  

}  

判斷是否已經排好序了的函式issorted()

[c-sharp]view plain

copy

bool

issorted(

intarray,

intsize)  

}  return

flag;  

}  

從0-n-1,只要有乙個數不符合排序規矩,就說明這個數還沒有排好序

前者的確是解決判斷是否已經排好序的問題,但如果這n個數要經歷所有的排序之後才能達到要求,這樣反而使得這樣的排序方法變得效率更差。

其實我可以使用標記的方法

在函式中定義乙個bool 的變數 issorted ,在每趟對剩餘的數字排序時,先把它設為true,然後當發生兩個兩個相鄰的數沒有按要求排時,在交換這兩個數的同時,把issorted設為false,不然就一直保持為true。

在進行好一趟排序之後,測試issorted這個變數的值,如果保持true,就說明已經排好序了,停止繼續排序,不然進行下一趟排序。

具體**:

[c-sharp]view plain

copy

void

betterbubble(

intarray,

intsize)  

}  if

(issorted)  

break

;  }  

}  

來自:

優化演算法 冒泡演算法

關於排序其實有很多演算法,冒泡使用是非常廣泛,也很易於理解,經過研究,我發現,冒泡可以有更優化的演算法 首先先來看一下冒泡的流程 可以看到,一共輸出是36個,去掉最終結果8個也就是28個,就是說冒泡至少需要n 1 n 2 1.那麼我嗯可以通過列印看到有些對比是重複的資料,沒必要出現的,那麼怎麼規避呢...

氣泡排序的優化演算法

氣泡排序的基礎演算法有哪些缺點 每一曾比較都要比較到陣列的最後,但是沒有必要,只要比較到無序數列就可以了 無序數列即沒有排過序的陣列元素所組成的序列 不管是否有序,都要進行n 1次迴圈,在內層迴圈定義的temp,則每次迴圈都要開闢乙個空間,浪費記憶體。可以從哪幾個方面來對基礎演算法進行優化?定義乙個...

氣泡排序 氣泡排序演算法優化

常用的排序演算法主要包括 1 插入排序 直接插入排序 希爾排序 2 交換排序 氣泡排序 快速排序 3 選擇排序 簡單選擇排序 堆排序快速排序 4 歸併排序其中,氣泡排序算是最簡單的一種排序演算法 public class bubble int temp 0 for int i 0 iarr j 1 ...