【領卓教育】C語言基礎教學之氣泡排序
在C語言中,經常會用到for迴圈語句,通過for迴圈語句,可以使很多程式變得簡便,同時也能實現很多普通語句不能實現的功能。在for迴圈中,不僅只是單純的一個for迴圈,例如:
main
{
...;
for(i=0;i<10;i++)
{
...;
}
return 0;
}
在上面這個簡單的程式碼中,僅僅是for迴圈的基本用法,也就是單層的for迴圈,接下來要講的氣泡排序演算法則是要用的for迴圈的巢狀迴圈。
接下來進入正題。氣泡排序,顧名思義,就是要讓數字像冒泡一樣,按照我們所需要的排序需求(從大到小或從小到大)進行有序的“冒泡”,先將程式貼在下面,在對程式進行解釋:
#include <stdio.h> #define N 10 int main() { static int a[N] ; int i,j,t; printf("請輸入要排序的十個數字:"); for(i=0;i<N;i++) { scanf("%d",&a[i]); } printf("\n"); for(i=0;i<N;i++) { printf("%-4d",a[i]); } printf("\n"); for(i=0;i<N-1;i++) // 需要排序的次數,有N個數,需要排序N-1次 { for(j=0;j<N-1-i;j++) // 每一次排序需要比較的次數 N個數需要比較N-1次 { if(a[j] > a[j+1]) { t = a[j] ; a[j] = a[j+1]; a[j+1] = t; } } } printf("氣泡排序(從小到大):"); for(i=0;i<N;i++) { printf("%-4d",a[i]); } printf("\n"); for(i=0;i<N-1;i++) // 需要排序的次數,有N個數,需要排序N-1次 { for(j=0;j<N-1-i;j++) // 每一次排序需要比較的次數 N個數需要比較N-1次 { if(a[j] < a[j+1]) { t = a[j] ; a[j] = a[j+1]; a[j+1] = t; } } } printf("氣泡排序(從大到小):"); for(i=0;i<N;i++) { printf("%-4d",a[i]); } printf("\n"); return 0; }
在上面的程式例程中,對鍵盤輸入的十個數字進行從大到小或者是從小到大的排序。如果需要對更多的數字進行排序,只需更改巨集變數的值,即可滿足要求,例如,要對20個數字進行排序,則:
#define N 20
在這裡,只對氣泡排序的一種情況拿出來單獨說明,另一種僅僅是稍微的修改,相信讀者能夠通過以下解釋通讀整個程式的核心。
for(i=0;i<N-1;i++) // 需要排序的次數,有N個數,需要排序N-1次 { for(j=0;j<N-1-i;j++) // 每一次排序需要比較的次數 N個數需要比較N-1次 { if(a[j] > a[j+1]) { t = a[j] ; a[j] = a[j+1]; a[j+1] = t; } } } printf("氣泡排序(從小到大):");
其中,要對N個數進行排序,就要進行N-1次的對數進行位置的移動,因為排到N-1次時,第N個數已經在這列數字的最後了,是沒有數字在與之交換的了,已經是最大的了,所以只需要進行N-1次的排序;同樣的到了,在第二層迴圈中,對數進行了比較,也只需要比較N-1次,當比較到N-1次時,最大的數字已經在這列數字的末尾,沒有“新”的數字與之相比,所以同樣只需要比較N-1次即可。
在第二層for迴圈中,數字比較後,如果滿足條件,則需要對數字的位置進行調換,引入了一箇中間變數,使得數字能夠交換。例如,此時j=2,a[2]>a[3],按照從小到大的要求,需要將此時的a[2]與a[3]調換位置,使a[2]變為a[3],a[3]變為a[2],(這麼說是有點繞,但筆者沒有更好的表述,讀者慢慢理解,亦可在紙上寫一寫,相信還是能夠看懂的)。“=”在C語言中是賦值運算子,所以,先將a[j]儲存在t中,然後將a[j+1]的值賦予a[j],在把t儲存的a[j]的值賦予a[j+1],實現前後兩個數字的交換。
以上便是筆者對冒泡的一些個人理解,如果有錯誤之處,望包容並能夠私信我指出,有哪裡沒有理解或者解釋不清楚的,亦可私信筆者。謝謝。
以上均來自【領卓教育】內部教學程式,如需轉載使用,務必註明出處,違者必究。