冒泡演算法的主要思想:
氣泡排序和插入排序相類似,都是簡單的排序演算法 ,時間複雜度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 ...