1. 程式人生 > >【領卓教育】C語言基礎教學之氣泡排序

【領卓教育】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],實現前後兩個數字的交換。

以上便是筆者對冒泡的一些個人理解,如果有錯誤之處,望包容並能夠私信我指出,有哪裡沒有理解或者解釋不清楚的,亦可私信筆者。謝謝。

以上均來自【領卓教育】內部教學程式,如需轉載使用,務必註明出處,違者必究。