今天把幾種氣泡排序都實現了一下,大概總結一下,個人筆記,有誤幫我指出,謝謝!
我總結的大概有這幾種氣泡排序:
1、 帶標誌的普通氣泡排序
2、 雙向氣泡排序(雞尾酒氣泡排序)
3、 奇偶氣泡排序
4、 區域性氣泡排序
5、 快速排序(不穩定)
先來看**:
1、//簡單氣泡排序
void simsort( int a, int n)
int i, j, tmp, tag = 1; //tag為1表示發生了交換
for( i=1; itag = 0; //0表示沒有交換
for( j=0; jif( a[j] > a[j+1] )
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
tag = 1;
帶標誌的最簡單,也非常有效,全部排序都需要這個,新手這個務必掌握。只要這一趟沒有發生交換,那麼就會停止迴圈掃瞄,減少了掃瞄的次數。乙個很簡單的例子,比如乙個順序的一組元素,就拿1,2,3,4,5來說吧,第一趟掃瞄完,發現沒有元素交換,如果沒有標誌,最外層迴圈條件為for( i=1; i2、
//雙向氣泡排序
void dbsort( int a, int n )
int i, j, k, tmp, tag=1; //tag=1為發生了交換的標誌
for( i=1; tag ; i++ )//如果tag為1則發生了交換,繼續迴圈,為0則停止
tag = 0;
for( j=n-i; j>=i; j-- )//由後往前找最小的元素
if( a[j] < a[j-1] )
tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
tag = 1;
for( k=i; kif( a[k] > a[k+1] )
tmp = a[k];
a[k] = a[k+1];
a[k+1] = tmp;
tag = 1;
雙向氣泡排序每一趟都是先從後往前掃找最大的元素,然後從前往後找最小的元素。對隨機序列排序效能稍高於普通氣泡排序,但是因為是雙向冒泡,每次迴圈都雙向檢查,極端環境下會出現額外的比較,導致演算法效能的退化,比如「4、5、7、1、2、3」這個序列就會出現退化。
3、//奇偶氣泡排序
void oddevensort( int a, int n )
int i, tmp, tag=1; //tag=1為發生了交換的標誌
dotag = 0; //設奇數趟無交換
for( i=1; iif( a[i] > a[i+1] )
tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
tag = 1;
tag = 0; //設偶數趟無交換
for( i=0; iif( a[i] > a[i+1] )
tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
tag = 1;
while( tag );
奇偶氣泡排序是每一趟都是掃瞄奇數項,交換相鄰的兩項元素,然後掃瞄偶數項,交換相鄰的元素。比如一組元素:5,3,2,1,9,4,先掃瞄奇數項的,假如都要交換,先交換5和3,再交換2和1,最後交換9和4;然後掃瞄偶數項,交換3和2,交換1和9(這個實際不用交換,為舉例說明而已),這是第一趟,每一趟都是如此,直到沒有交換了為止,即tag=0。每一趟都要掃瞄那麼多的元素,並不像上面的越到後面的趟元素越少,看起來貌似會花更多的時間,這個有興趣的可以測試一下,和一般的冒泡比較一下。
4、區域性氣泡排序
這個只是在網上看到了有這樣的氣泡排序,還有待研究,會得教我一下。
在氣泡排序中,一趟掃瞄有可能無資料交換,也有可能有一次或多次資料交換,在傳統的氣泡排序演算法及近年來的一些改進的演算法中,只記錄一趟掃瞄有無資料交換的資訊,對資料交換發生的位置資訊則不予處理。為了充分利用這一資訊,可以在一趟全域性掃瞄中,對每一反序資料對進行區域性氣泡排序處理,稱之為區域性氣泡排序。
區域性氣泡排序與氣泡排序演算法具有相同的時間複雜度,並且在正需和逆序的情況下,所需的關鍵字的比較次數和移動次數完全相同。由於區域性氣泡排序和氣泡排序的資料移動次數總是相同的,而區域性氣泡排序所需關鍵字的比較次數常少於氣泡排序,這意味著區域性氣泡排序很可能在平均比較次數上對冒泡派粗有所改進,當比較次數較少的優點不足以抵消其程式複雜度所帶來的額外開銷,而當資料量較大時,區域性氣泡排序的時間效能則明顯優於氣泡排序。
5、快速排序
快速排序不穩定,但是是最快的內部排序(書上說的)。快速排序也有好幾種變種,這個得另外總結。
以上是我個人的幾點總結,不能說是總結吧,因為沒總結什麼出來,只是給自己做個筆記,以後需要容易找得到。
大四找實習中……沒啥要求,**都可以,首選廣東,因為我是廣東清遠的,現在在贛州讀書。望有門路的朋友告訴我,無限感激!
幾種冒泡 起泡 排序的總結
幾種冒泡 起泡 排序的總結 今天把幾種氣泡排序都實現了一下,大概總結一下,個人筆記,有誤幫我指出,謝謝!我總結的大概有這幾種氣泡排序 1 帶標誌的普通氣泡排序 2 雙向氣泡排序 雞尾酒氣泡排序 3 奇偶氣泡排序 4 區域性氣泡排序 5 快速排序 不穩定 先來看 1 簡單氣泡排序 void simso...
C語言氣泡排序(起泡法)
冒泡法排序是c語言中較簡單的 排序演算法 的 定義 它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,讓較大的元素逐漸往後移動 交換兩個元素的值 直到陣列的末尾。如此反覆,直到沒有可以交換的元素,即從小到大排序好 思路 有n個數,每輪替換乙個數,假設最大的數在第乙個,則一共需要替換n 1輪 此時...
幾種排序演算法總結(冒泡 選擇 插入 快速)
今天總結了幾個比較基礎常用的排序演算法。寫下來,以後可以直接參考。var o return arr 插入排序 穩定 假設待排序的記錄存放在陣列r 1 n 中,初始時,r 1 自成乙個有序區,不需要比較,無序區r 2.n 從i 2起到i n為止,依次將r i 插入當前有序區。帶插入的記錄r i 從右向...