當前位置:編程學習大全網 - 源碼下載 - c語言泡泡算法!!!

c語言泡泡算法!!!

冒泡排序算法的分析與改進

交換排序的基本思想是比較待排序記錄的關鍵字,當發現兩條記錄的順序相反時進行交換,直到沒有順序相反的記錄為止。

應用交換排序基本思想的主要排序方法有:冒泡排序和快速排序。

冒泡排序

1,排序方法

排序後的記錄數組R [1...n]垂直排列,將每條記錄R[i]視為壹個權重為R[i].key的氣泡,根據輕氣泡不能在重氣泡之下的原則,對數組R進行自下而上的掃描:掃描每壹個違反該原則的輕氣泡,使其向上“浮動”。重復這個過程,直到最後的兩個氣泡中,較輕的在頂部,較重的在底部。

(1)初始

R [1...n]是壹個無序區域。

(2)第壹次掃描

從無序區底部向上依次比較相鄰兩個氣泡的重量。如果發現較輕的在下面,較重的在上面,就交換位置。也就是比較(R[n],R[n-1]),(R[n-1],R[n-2]),...,(R[2],R[1]);對於每壹對泡泡(r [j+1],R[j]),如果R[j+1]。鍵< R[j]。鍵,R[j+1]和r [j]的內容互換。

當第壹次掃描完成後,“最輕”的氣泡會浮到區間頂部,即關鍵字最小的記錄放在最高位置R[1]。

(3)第二次掃描

掃描r [2...n】。當掃描完成時,“第二個光”氣泡漂浮到R[2]的位置...

最後,有序區域R [1...n]可以在n-1次掃描後獲得。

註意:

在第I次掃描時,R [1...I-1]和R [I...n]分別是當前有序區和無序區。掃描仍然是從無序區域的底部到該區域的頂部。當掃描完成後,這個區域最輕的氣泡浮到頂部位置R[i],結果是R [1...I]成為新的有序區域。

2.氣泡分類過程示例

對關鍵字序列為49 38 65 97 76 13 27 49的文件進行冒泡排序的過程。

3.分類算法

(1)分析

因為每次排序都會給有序區域增加壹個氣泡,經過n-1次排序後,有序區域有n-1個氣泡,無序區域的氣泡重量總是大於等於有序區域的氣泡重量,所以整個氣泡排序過程最多需要n-1次排序。

如果在某壹次排序通過中沒有發現氣泡位置的交換,則說明待排序的無序區域中的所有氣泡都滿足較輕的在上面,較重的在下面的原則,所以在這壹次排序通過後可以終止氣泡排序過程。因此,在下面給出的算法中,引入了布爾交換,並且在每次排序之前將其設置為FALSE。如果在排序過程中發生交換,則將其設置為TRUE。每次分揀結束時檢查交換。如果沒有發生交換,則終止算法,並且不排序下壹遍。

(2)具體算法

void冒泡排序(SeqList R)

{//R(l..n)為待排序文件,R為自底向上掃描冒泡。

int i,j;

布爾交換;//交換標誌

for(I = 1;我& ltn;I++){ //最多做n-1排序。

交換=假;//此行排序開始前,交換標誌要為假。

for(j = n-1;j & gt= I;j-)//掃描當前無序區域R [i...從下到上。

if(R[j+1]。key & ltR[j]。key){//交換記錄

R[0]= R[j+1];//R[0]不是崗哨,只是壹個臨時存儲單元。

R[j+1]= R[j];

R[j]= R[0];

交換=真;//交換已經發生,所以交換標誌設置為true。

}

如果(!交換)//本次排序沒有交換,算法提前終止。

返回;

} //endfor(外部循環)

} //BubbleSort

4.算法分析

(1)算法的最優時間復雜度

如果文件的初始狀態是正序,排序可以在壹次掃描中完成。所需的關鍵字比較時間c和記錄移動時間m都達到最小值:

Cmin=n-1

Mmin=0 .

冒泡排序的最佳時間復雜度為O(n)。

(2)算法的最壞時間復雜度

如果初始文件的順序相反,則需要對n-1遍進行排序。每次排序都需要N-i個關鍵字比較(1≤i≤n-1),每次比較都要移動記錄三次才能到達交換記錄位置。在這種情況下,比較和移動的次數達到最大值:

Cmax=n(n-1)/2=O(n2)

Mmax=3n(n-1)/2=O(n2)

冒泡排序最差的時間復雜度是O(n2)。

(3)該算法的平均時間復雜度為O(n2)

雖然冒泡排序不必經過n-1遍,但由於記錄移動次數較多,其平均時間性能比直接插入排序差很多。

(4)算法的穩定性

冒泡排序是原地排序,比較穩定。

5.改進算法

上述氣泡排序也可以改進如下:

(1)記住上次交換位置的冒泡排序。

在每次掃描中,記住最後壹次交換的位置(這個位置之前的相鄰記錄都是有序的)。在下壹次排序開始時,r [1..lastexchange-1]是有序區域,R[lastExchange..n]是壹個無序區域。這樣,壹遍排序可以在當前有序區域中擴展多條記錄,從而減少排序遍數。具體算法見習題。

(2)通過改變掃描方向進行氣泡分類

①氣泡分選的不對稱性

當壹次掃描即可完成分類時:

只有最輕的氣泡位於R[n]的位置,其余的氣泡按順序排列,所以只需要壹次掃描就可以完成排序。

例如,對於初始關鍵字序列12,18,42,44,45,67,94,10,只需要壹次掃描。

需要n-1次掃描來完成排序:

當只有最重的氣泡位於R[1]的位置,而其余的氣泡已經排序時,仍然需要n-1次掃描來完成排序。

比如初始關鍵詞序列:94,10,12,18,42,44,45,67,需要掃描七次。

②不對稱的原因

每次掃描只能讓最重的氣泡“沈”壹個位置,所以當頂部最重的氣泡沈到底時,需要n-1次掃描。

③改善不對稱的方法。

在排序過程中交替改變掃描方向可以改善不對稱性。

  • 上一篇:請問:如何在k線上顯示MACD形態?
  • 下一篇:logstash 和filebeat 是什麽關系
  • copyright 2024編程學習大全網