冒泡排序

一、概念

冒泡排序(Bubble Sort):一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄爲止。

二、排序用到的結構與函數

#define MAXSIZE 10    /*用於要排序數組個數最大值,可根據需要修改*/
typedef struct
{
    int r[MAXSIZE+1];    /*用於存儲要排序數組,r[0]用作哨兵或臨時變量*/
    int length;    /*用於記錄順序表的長度*/
}SqList;

/*交換L中數組r的下標爲i和j的值*/
void swap(SqList *L ,int i,int j)
{
    int temp=L->r[i];
    L->r[i]=L->r[j];
    L->r[j]=temp;
}

三、不同級別的冒泡排序

1、冒泡排序初級版

/*對順序表L作交換排序*/
void BubbleSort0(SqList *L)
{
    int i,j;
    for(i=1;i<L->length;i++)
    {
        for(j=i+1;j<=L->length;j++)
        {
            if(L->r[i]>L->r[j])
                swap(L,i,j);    /*交換L->[i]與L->r[j]的值*/
        }
    }
}

說明:這個算法總是把此低的數據換到靠後的位置,算法效率非常低。

 

2、冒泡排序

/*對順序表L作冒泡排序*/
void  BubbleSort(SqList *L)
{
    int i,j;
    for(i=1;i<L->length;i++)
    {
        for(j=L->length-1;j>=i;j--)    /*注意j是從後往前循環*/
        {
            if(L->r[j]>L->r[j+1])    /*若前者大於後者(注意這裏與上一算法差異)*/
                swap(L,j,j+1);    /*交換L->r[j]和L->r[j+1]的值*/
        }
    }
}

說明:這個算法有一個缺點,當給出的整個順序表已經是有序的,但是代碼還是要一一比較

 

3、冒泡排序優化版

/*對順序表L作改進冒泡算法*/
void BubbleSort2(SqList *L)
{
    int i,j;
    Status flag=TRUE;    /*flag用來作爲標記*/
    for(i=1;i<L->length && flag;i++)    /*若flag爲false則退出循環*/
    {
        flag=FALSE;    /*初始爲false*/
        for(j=L->length-1;j>=i;j--)
        {
            if(L->r[j]>L->r[j+1])
            {
                swap(L,j,j+1);    /*交換L->r[j]與L->r[j+1]的值*/
                /*在這個大循環中如果有數據循環false=true,若是沒有,說明整個表已是有序的了,不需要再循環比較了*/
                false=TRUE;
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章