【笔记】冒泡排序法

/*
 *    内容:    冒泡排序法
 *    作者:    wolves_liu
 *    日期:    2018.3.21
 *    参考:  《大话数据结构》
 */
 
// 线性表顺序存储结构

#define        Max        20
typedef struct
{
    int r[Max+1];
    int length;
}Sqlist;

// 交换L->r[i]和L->r[j]的值

void swap(Sqlist *L, int i, int j)
{
    int temp = 0;
    temp = L->r[i];
    L->r[i] = L->r[j];
    L->r[j] = temp;
}

// (伪)冒泡算法1

void BubbleSort0(Sqlist *L)    //小的数放上面去
{
    int i, j;
    for(i=1; i<L->length; i++)    // 用第i个元素跟它后面的每一个元素都进行比较
    {
        for(j=i+1; j<=L->length; j++)
        {
            if(L->r[i] > L->r[j])
            {
                swap(L, i, j);    // 交换L->r[i]和L->r[j]的值
            }
        }
    }
}

// (正宗)冒泡算法2

void BubbleSort1(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);
            }
        }
    }
}

// (对冒泡算法进一步优化)冒泡算法3

void BubbleSort3(Sqlist *L)
{
    int i = 0, j = 0;
    bool flag = 1;                        // 用flag作标记
    for(i=1; i<L->length && flag; i++)    // 如果flag为真,就执行循环
    {
        flag = 0;
        for(j=L->length-1; j>=i; j--)
        {
            if(L->r[j] > L->r[j+1])
            {
                swap(L, j, j+1);
                flag = 1;                // 如果执行了交换函数,让flag为真,就可以继续执行循环;
                                        // 如果没有执行交换函数,则flag为假,就不用执行外循环了。
            }
        }
    }
}

// 自己写的,r[0]-r[4]

void swap(int &a, int &b)
{
    int temp = a;
    a = b;
    b = temp;
}


int main(int argc, _TCHAR* argv[])
{
    int r[5] = {8, 6, 36, 2, 0};

    // 对应(伪)冒泡算法1
    for(int i=0; i<4; i++)
    {
        for(int j=i+1; j<5; j++)
        {
            if(r[i] > r[j])
            {
                swap(r[i], r[j]);
            }
        }
    }
    
    // 对应(正宗)冒泡算法2
    for(int i=0; i<4; i++)
    {
        for(int j=3; j>=i; j--)    //j是倒数第二开始
        {
            if(r[j] > r[j+1])
            {
                swap(r[j], r[j+1]);
            }
        }
    }

    for(int i=0; i<5; i++)
    {
        cout<<(r[i])<<endl;
    }
      
    return 0;    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wolves_liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值