排序系列(一)

2021-05-23 16:40:04 字數 1823 閱讀 6795

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 看做是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹 樹中任一非葉結點...