1. 程式人生 > >資料結構與演算法 (二) 氣泡排序

資料結構與演算法 (二) 氣泡排序

1.演算法思想:

      每次將待排序檔案中的兩個記錄的排序碼進行比較,如果不滿足要求,則交換著兩個記錄在檔案中的順序,直到檔案中任意兩個記錄之間都滿足排序要求為止 (氣泡排序和快速排序都屬於交換排序

2.演算法過程:

        首先比較第1個記錄和第2個記錄的排序碼,如果不滿足排序要求,則交換第1個記錄和第2個記錄的位置;然後對第2個記錄(可能是新交換過來的最初的第1個記錄)和第三個記錄進行同樣的處理,重複此過程,直到處理完第n-1個記錄和第n個記錄為止,以上為一次起泡過程,處理的結果就是把排序碼最小或者最大的那個記錄交換到最後一個記錄的位置,到達這個記錄在最後排序後的正確位置,然後重複上述起泡過程,但每次只對前面的未排序好的記錄進行處理,直到所有記錄排序好為止。

      在每次起泡過程中設定一個標誌位,用以標註每次起泡過程中是否進行過記錄交換,如果某次起泡過程中未發生交換則表明整個過程記錄已經達到了排序的要求 ,顯然對n個記錄的排序處理最多為n-1次

2.演算法實現

#include <stdio.h>
#include <stdlib.h>

enum boolean {FALSE,TRUE};
typedef enum boolean Bool;

#define TRUE 1
#define FALSE 0

#define Bool int

typedef int ElementType;

struct forSort
{
    ElementType key;
};

typedef struct forSort ForSort;

void InitForSort(ForSort *FS,int a)
{
    FS->key=a;
}

void BubbleSort(ForSort A[],int n)
{
    int i,j;
    Bool flag;
    //此處結構體 宣告變數 A[] 為 ForSort 所以下邊使用temp 直接可以賦值
    ForSort temp;

    //查詢初始位置為 N-1 所以用 i--
    for(i=n-1; flag=(Bool)1, i>0&&flag; i--)
    {
        //從第0個開始比較 每次比較都少一位置 (向前推進一位)
        for(j=0; j<i; j++)
        {
            if(A[j+1].key<A[j].key)
            {
                flag=TRUE;
                temp=A[j+1];
                A[j+1]=A[j];
                A[j]=temp;
            }
        }
    }
}


int main()
{
    int i;
    int A[8]={28,13,72,85,39,41,6,20};

    BubbleSort(A,8);

    for(i=0;i<8;i++){
        printf("%d\n",A[i]);
    }

    return 0;
}