冒泡演算法之我見!
什麼是冒泡演算法?
冒泡演算法主要用於解決元素間的順序問題,即從大到小,還是從小到大。冒泡?一瓶汽水中溢位來的氣泡。排序?對氣泡進行編號1,2,3……,即按先後順序進行站位。
當然,作為程式設計師,冒泡演算法是我們必須要get的一門演算法,雖然它沒那麼簡單,但卻和前文所述大同小異。
說到“冒泡演算法”,首先要想到“比較”二字,它是兩兩相鄰元素間的比較,其次是“迴圈”二字,多個元素之間的比較,比較多次,所以必須要用到迴圈,如果是兩個元素之間的比較,就沒必要用到冒泡演算法,因為兩個字,麻煩,一個if……else語句就能解決的事,沒必要上升到演算法層面。至於一堆元素是按從小到大排序,還是從大到小排序,取決於事先設定好的判斷語句的條件。
關鍵來了,冒泡演算法如何應用到程式碼中?
首先要用“陣列”對一堆元素進行儲存,其次是利用“兩次迴圈”(比如說(1,2,3),需要將其按從大到小進行輸出。先分析題意,(1,2,3)三個元素的陣列下標為0,1,2,即arr[0],arr[1],arr[2],定義兩個變數i,j,此外,還要再定義一箇中間變數t,用以兩個數值間的交換,下來就是前文提到的利用迴圈了,這裡都用for,純屬個人喜好,第一層迴圈for(i=0;i<3;i++),巢狀第二層迴圈for(j=i+1;j<3;j++),i,j的取值範圍是[0,3),根據陣列的下標來定,因為只有三個元素,所以下標的最大值是2,為什麼第二層迴圈j=i+1,因為j如果從0開始,那麼a[i]與a[j],當且僅當i=j時,兩者相比就毫無意義,且導致程式碼的計算量加大,進而增大系統開銷,迴圈結束後,再用if語句,if(a[i]<a[j]),條件成立,利用中間變數t,交換a[i]與a[j]的數值,反之,繼續開始執行迴圈語句,再判斷,直到結束),最後再利用迴圈,進行排序後的輸出就可以了。
例:任意輸入在int範圍內的十個數值,按從小到大進行輸出。(有符號int的取值範圍為(-21億-21億),無符號int的取值範圍為(0-42億))
分析同上,具體程式碼及執行結果如下:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { int i, j, t, arr[10]; printf("請您輸入十個數:\n"); for (i = 0; i <10; i++) { scanf("%d",&arr[i]); } for (i = 0; i < 10; i++) { for (j = i + 1; j < 10; j++) { if (arr[i]>arr[j]) { t = arr[i]; arr[i] = arr[j]; arr[j] = t; } } } printf("您輸入的十個數,從小到大輸出分別為:\n"); for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } printf("\n"); system("pause"); return 0; }
本人是初學者,以上見解純屬個人理解,有什麼說的不對的地方,希望各位大佬不吝指教,可以私信給我哦!