1. 程式人生 > >C語言的氣泡排序

C語言的氣泡排序

氣泡排序演算法的運作如下:(從後往前)

1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

3.針對所有的元素重複以上的步驟,除了最後一個。

4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
由於在排序過程中總是小數往前放,大數往後放,相當於氣泡往上升,所以稱作氣泡排序。

用二重迴圈實現,外迴圈變數設為i,內迴圈變數設為j。假如有10個數需要進行排序,則外迴圈重複9次,內迴圈依次重複9,8,…,1次。每次進行比較的兩個元素都是與內迴圈j有關的,它們可以分別用a[j]和a[j+1]標識,i的值依次為1,2,…,9,對於每一個i,j的值依次為1,2,…10-i。
測試程式碼如下:

#include <stdio.h>
#define  N  10 

int main()
{
   static int a[N] ; 
   int i,j,t;
   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;
}

這個是普通版本的氣泡排序,然後下來使用C語言指標做的氣泡排序,實驗程式碼如下:

#include <stdio.h>
#define  N  10 

int main()
{
    static int a[N] ; 
    int *p = a;
    int i,j,t;
    for(i=0;i<N;i++)
    {
        scanf("%d",p+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(*(p+j) > *(p+j+1)) 
            {
                t = p[j] ; 
                p[j] = p[j+1]; 
                p[j+1] = t;
            }
            
        }
    }
    printf("氣泡排序(從小到大):");
    for(i=0;i<N;i++)
    {
        printf("%-4d",p[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;
}

最後還有一版優化的冒泡選擇排序:

#include <stdio.h>
#define  N  10 

int main()
{
    static int a[N] ; 
    int i,j,t,min;
    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次排序  
    {
//        min = i ; 
        for(j=0,min=0;j<N-1-i;j++) //每一次排序需要比較的次數, N個數需要比較N-1次
        {
            if(a[min] > a[j+1] )
            {
                min = j+1; 
            }
        }
        t = a[N-1-i] ; 
        a[N-1-i] = a[min] ; 
        a[min] = t; 
    }

    printf("選擇排序優化版:");
    for(i=0;i<N;i++)
    {
        printf("%-4d",a[i]);
    }
    printf("\n");
    return 0;
}

大家要在實際應用中具體使用,需要靈活應用。
------領卓教育