排序算法之冒泡排序

  1、算法描述:

     冒泡排序法也叫气泡排序法,是交换排序的一种,是根据在水中轻气泡不能在重气泡之下的原则设计的。主要是想为:扫描所以数据,进行两两比较,发现违反轻气泡在重气泡之下的原则的数,交换其位置,让重气泡下沉,轻气泡上浮。


  2、算法实现:

     例如:要求对元素序列{23,49,32,56,12,87,65}进行冒泡排序,其过程分析如下:对于N个元素,最多进行N-1趟,每趟两两比较要N-1次

    第一趟后序列为:23,32,49,12,56,65,87

    第二趟后序列为:23,32,12,49,56,65,87

    第三趟后序列为:23,12,32,49,56,65,87

    第四趟后序列为:12,23,32,49,56,65,87 

    第五趟后序列为:12,23,32,49,56,65,87

    第六趟后序列为:12,23,32,49,56,65,87

可以发现第一趟后最大的排在最后位置,第二趟后次大的排在倒数第二个位置,依次排好序时,进行了前五趟,故第六趟可以省略,但按通常的写法,我们要执行六趟,代码及结果如下:

int main()
{
    int data[] = {23, 49, 32, 56, 12, 87, 65};
    cout << "排序前的数组为:" << endl;
    for (int i = 0; i < 7; i++){
        cout << data[i] << "  ";
    }
    cout << endl;
    bubbleSort1(data, 7);
    cout << "排序后的数组为:" << endl;
    for (int i = 0; i < 7; i++){
        cout << data[i] << "  ";
    }
    cout << endl;

    system("pause");
    return 0;
}

  //一般算法实现
void bubbleSort1(int data[], int n)
{
    int temp;
    for (int i = 0; i < n-1; i++)
    {
        for (int j = 1; j < n; j++){
            if (data[j - 1]>data[j]){
                temp = data[j - 1];
                data[j - 1] = data[j];
                data[j] = temp;
            }
        }
        cout << "第" << i+1 << "趟排序后的数组为:";
        for (int k = 0; k < n; k++){
            cout << data[k] << "  ";
        }
        cout << endl;
    }
}

运行结果如下:


算法改进:

    根据算法描述可知,只要在某一趟比较中相邻两两元素只有比较动作而没有交换动作,说明排序完成,还是上面的例子,发现只要比较进行4趟就完成了排序,故可以设置一个标志位来判断是否发生了交换动作,改进后的程序如下:

   void bubbleSort2(int data[], int n)

{

    int flag;

   int i = 1;

   int tmp;

   do

{

      flag = 0;

     for(int j = 1; j< n;j++)

{

      if(data[j-1]>data[j])

{

     temp = data[j-1];

     data[j-1] = data[j];

     data[j] = temp;

    flag = 1;

}

}

i++;

} while(i<n&&flag = = 1);

}


运行结果如下:


   3、算法时间度分析:

    冒泡排序在最好的情况下,初始状态就已经是升序排列,则只需要进行N-1次元素之间的比较,且不用进行元素之间的移动即可结束排序,故最好情况下的时间复杂度为O(N);在最坏情况下即元素序列为逆序排列时,需要进行N-1趟排序,故最坏情况下时间复杂度为O(N2);在一般情况下,及随机分布的情况下,冒泡排序时间复杂度也为O(N2)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值