1. 程式人生 > >冒泡演算法之我見!

冒泡演算法之我見!

  什麼是冒泡演算法?

  冒泡演算法主要用於解決元素間的順序問題,即從大到小,還是從小到大。冒泡?一瓶汽水中溢位來的氣泡。排序?對氣泡進行編號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;
}

  本人是初學者,以上見解純屬個人理解,有什麼說的不對的地方,希望各位大佬不吝指教,可以私信給我哦!