1
.冒泡法:
這是最原始,也是眾所周知的最慢的演算法了。他的名字的由來因為它的工作看來象是冒泡:
#include
<
iostream.h
>
void
bubblesort(
int*
pdata,
intcount)}}
}void
main()
;bubblesort(data,7);
for(
inti=0
;i<7;i
++)cout
<<
data[i]
<<""
;cout
<<"/n
";}倒序(最糟情況)
第一輪:10,
9,8,
7->10,
9,7,
8->10,
7,9,
8->7,
10,9,
8(交換3次)
第二輪:7,
10,9,
8->7,
10,8,
9->7,
8,10,
9(交換2次)
第一輪:7,
8,10,
9->7,
8,9,
10(交換1次)
迴圈次數:6次
交換次數:6次
其他:第一輪:8,
10,7,
9->8,
10,7,
9->8,
7,10,
9->7,
8,10,
9(交換2次)
第二輪:7,
8,10,
9->7,
8,10,
9->7,
8,10,
9(交換0次)
第一輪:7,
8,10,
9->7,
8,9,
10(交換1次)
迴圈次數:6次
交換次數:3次
上面我們給出了程式段,現在我們分析它:這裡,影響我們演算法效能的主要部分是迴圈和交換,顯然,次數越多,效能就越差。從上面的程式我們可以看出迴圈的次數是固定的,為1+2
+...+n
-1。寫成公式就是1/2
*(n-1
)*n。現在注意,我們給出o方法的定義:
若存在一常量k和起點n0,使當n
>=
n0時,有f(n)
<=k*
g(n),則f(n)
=o(g(n))。(呵呵,不要說沒學好數學呀,對於程式設計數學是非常重要的!!!)
現在我們來看1/2
*(n-1
)*n,當k=1
/2,n0=
1,g(n)=n
*n時,1/
2*(n-
1)*n
<=1/
2*n*
n=k*
g(n)。所以f(n)
=o(g(n))
=o(n
*n)。所以我們程式迴圈的複雜度為o(n
*n)。
*n)。當資料為正序,將不會有交換。複雜度為o(
0)。亂序時處於中間狀態。正是由於這樣的原因,我們通常都是通過迴圈次數來對比演算法。
再看交換。從程式後面所跟的表可以看到,兩種情況的迴圈相同,交換不同。其實交換本身同資料來源的有序程度有極大的關係,當資料處於倒序的情況時,交換次數同迴圈一樣(每次迴圈判斷都會交換),複雜度為o(n
來自:http://topic.csdn.net/u/20080928/14/4e7a079c-21c4-484b-ab80-3785beccd489.html
排序總結系列一 氣泡排序
氣泡排序步驟 設陣列長度為n 1 比較相鄰的前後二個資料,如果前面資料大於後面的資料,就將二個資料交換。2 這樣對陣列的第0個資料到n 1個資料進行一次遍歷後,最大的乙個資料就 沉 到陣列第n 1個位置。3 n n 1,如果n不為0就重複前面二步,否則排序完成。氣泡排序1 void bubbleso...
排序系列 比較排序系列之 氣泡排序
氣泡排序屬於交換排序的一種典型的交換排序。交換排序的基本思想是 兩兩比較待排序的關鍵碼,發現記錄逆置則進行交換,知道沒有逆置對位置。對於氣泡排序而言,則就是單純的兩兩進行比較,知道不能再繼續冒泡為止。我們通過 45,34,78,12,34 32,29,64 陣列為例,進行講解。i值過程 i 0j 7...
排序系列 堆排序
1 堆排序定義 n個關鍵字序列kl,k2,kn稱為堆,當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k2i且ki k2i 1 或 2 ki k2i且ki k2i 1 1 i 若將此序列所儲存的向量r 1.n 看做是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹 樹中任一非葉結點...