三、針對問題進行優化
總結氣泡排序的原理是:
從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的乙個或最小的乙個。這個數就會從序列的最右邊冒出來。
以下是本篇文章正文內容
氣泡排序,是一種電腦科學領域的較簡單的排序演算法。
它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從z到a)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。
這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端(公升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名「氣泡排序」。 函式如下(示例):
for
(i=0
; i1; i++
)/* 外迴圈為排序趟數,len個數進行len-1趟 */
for(j=
0; j
1-i; j++
)}
從頭開始比較相鄰的兩個元素,如果有乙個的元素比相鄰的元素的大(小),就交換兩個元素的位置。
注:這些可以根據寫程式的人的意願來調整
往前對每個相鄰的元素都做這樣的比較、交換操作,這樣到陣列頭部時,第 1 個元素會成為最大的元素。
重新開始第 1、2 步的操作,除了在這之前頭部已經排好的元素。
繼續對越來越少的資料進行比較、交換操作,直到沒有可比較的(即沒有逆序的)資料為止,排序完成。
程式如下(示例):
#include
#define arr_len 255
/*陣列長度上限*/
#define elemtype int
/*元素型別*/
/* 氣泡排序 */
/* 1. 從當前元素起,向後依次比較每一對相鄰元素,若逆序則交換 */
/* 2. 對所有元素均重複以上步驟,直至最後乙個元素 */
/* elemtype arr: 排序目標陣列 int len: 元素個數 */
void bubblesort (elemtype arr,
int len)}}
int main (
void);
int len =10;
int i;
bubblesort (arr, len)
;for
(i=0
; i) printf (
"%d\t"
, arr[i]);
putchar (
'\n');
return0;
}
資料的順序排好之後,冒泡演算法仍然會繼續進行下一輪的比較,直到arr.length-1次,後面的比較沒有意義的。
新增變數鑰匙key。
如果發生了交換,key設定為true;如果沒有交換就設定為false。
這樣當一輪比較結束後如果key仍為false,即:這一輪沒有發生交換,這就說明資料的順序已經排好,沒有必要繼續進行下去。
c語言沒有布林值(true值和false值)
c語言中表示真假的值是0和1,我們可以利用預定**決。
true可以用1替代
false可以用0替代
#define true 1
/*將true的值定義為1,即為真*/
#define false 0
/*將false的值定義為0,即為假*/
#include
#define arr_len 255
/*陣列長度上限*/
#define elemtype int
/*元素型別*/
#define bool short
/*將bool定義為short關鍵字,便於區分*/
#define true 1
/*將true的值定義為1,即為真*/
#define false 0
/*將false的值定義為0,即為假*/
/* 氣泡排序 */
/* 1. 從當前元素起,向後依次比較每一對相鄰元素,若逆序則交換 */
/* 2. 對所有元素均重複以上步驟,直至最後乙個元素 */
/* elemtype arr: 排序目標陣列 int len: 元素個數 */
void bubblesort (elemtype arr,
int len)}if
(false == key)
break
;/*判斷標誌位是否為false,如果為false,說明後面的元素已經有序,就果斷break*/}}
int main (
void);
int len =10;
int i;
bubblesort (arr, len)
;for
(i=0
; i) printf (
"%d\t"
, arr[i]);
putchar (
'\n');
return0;
}
注意看執行秒數
process exited after 0.6533 seconds with return value 0
請按任意鍵繼續. . .
請按任意鍵繼續. . .
次數優化前
優化後第一次
0.4732s
0.4641s
第二次0.4432s
0.453s
第三次0.582s
0.4395s
第四次……
……備註:這裡統計次數較少,而且只用了一組資料做實驗,結果可能不太嚴謹
有質疑的小夥伴可以自己多做幾次對比,最好可以使用不同的資料(但每一組要對應)進行實驗
氣泡排序是一種簡單的穩定的排序演算法。. 比較相鄰的兩個資料,如果資料之間滿足整體的要求(從小到大或者從大到小)則交換當前的兩個元素的值,直到整體有序。
我們可以考慮對起泡排序演算法的改進。具體的某乙個待排序元素序列可能不需要執行n - 1 次趟排序就能全部排好。為此 ,我們可以再演算法中加上乙個變數key ,用來標示本趟起泡結果是否發生了逆序交換 。如果沒有發生交換,則 false == key ,表示全部的元素都已經排好了,可以進行終止處理,否則繼續進行排序。
氣泡排序法在日常中並不會經常性使用,但其思維可以供我們學習。
氣泡排序演算法C語言實現
氣泡排序 bubblesort 的基本概念是 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟 首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在...
排序演算法 氣泡排序 C語言實現
氣泡排序介紹 氣泡排序 bubble sort 又稱為氣泡排序。這是一種較簡單的排序演算法。它會遍歷若干次要排序的陣列,每次遍歷時,它都會從前往後依次比較相鄰兩個數的大小 如果前者大於後者,則兩者位置互換。由此,一次遍歷後,最大元素就在數列末尾。採用相同方法再次遍歷時,第二大的元素就被排列在最大元素...
經典排序演算法 氣泡排序(C語言實現)
氣泡排序是一種較為簡單的排序演算法,其基本思想為從頭開始依次比較相鄰的兩個元素大小,將較大 較小 的元素移至右端,最終使最大 最小 的元素移至序列最後,再次重複上述過程,直到最終序列完全有序為止。例如 有一行數分別是26 10,83,56,28,66,7 說明 按照從小到大的順序進行排序,方框數為比...