zoukankan      html  css  js  c++  java
  • 排序算法——冒泡排序

     

    在前面的文章中,已经向大家介绍了插入排序和选择排序两种基本的排序方法。今天要介绍的是另外一种排序方法——冒泡排序。

    思想

    同之前介绍的两种排序方式一样,冒泡排序也是最简单最基本的排序方法之一。冒泡排序的思想很简单,就是以此比较相邻的元素大小,将小的前移,大的后移,就像水中的气泡一样,最小的元素经过几次移动,会最终浮到水面上。

    举例分析说明一下,如下数据:

    2 7 4 6 9 1 首先比较最后两个数字,发现1比9小,于是前移

    2 7 4 6 1 9 然后比较6和1

    2 7 4 1 6 9 继续前移,然后是4和1

    2 7 1 4 6 9 7和1比较

    2 1 7 4 6 9 2和1

    1 2 7 4 6 9 至此,第一趟冒泡过程完成,最小的元素1被移到第一个,不再参与后面的排序过程。下一趟冒泡过程同理,比较6和9,以此类推,最终得到结果。

    代码

    复制代码
            cout << "bubble sort:" << endl;
    printline("before sort:", v);
    for (int i=0; i<v.size(); i++){
    int temp = 0;
    for(int j=v.size()-1; j>0; j--){
    if (v[j] < v[j-1]){
    temp = v[j];
    v[j] = v[j-1];
    v[j-1] = temp;
    }
    }
    }
    printline("after sort:",v);
    复制代码

    分析

    因为每一趟排序都使有序区增加了一个气泡,在经过n-1趟排序之后,有序区中就有n-1个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行n-1趟排序。以此本算法的时间复杂度还是O(n*n),也不能算是一个高效的算法。

    细心分析不难发现,本算法还有可以优化的空间,若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为此, 在下面给出的算法中,引入一个布尔量exchange,在每趟排序开始前,先将其置为FALSE。若排序过程中发生了交换,则将其置为TRUE。各趟排序 结束时检查exchange,若未曾发生过交换则终止算法,不再进行下一趟排序。这样可以减少不必要的比较。代码如下

    复制代码
    int bubble_sort(vector<int> &v){
    cout << "bubble sort:" << endl;
    printline("before sort:", v);
    bool exchange;
    for (int i=0; i<v.size(); i++){
    int temp = 0;
    exchange = false;
    for(int j=v.size()-1; j>0; j--){
    if (v[j] < v[j-1]){
    temp = v[j];
    v[j] = v[j-1];
    v[j-1] = temp;
    exchange = true;
    }
    }
    if (!exchange){
    break;
    }
    }
    printline("after sort:",v);
    }
    复制代码

    以上就是对冒泡排序的一个简单说明和讲解,希望可以对大家有所启发和帮助。

    之后会介绍一些高效的排序算法,敬请期待。

  • 相关阅读:
    python 安装第三方插件库报错的解决方案
    vue.js helloword
    node.js HelloWord
    十一 —— 迭代器、生成器、装饰器
    十、函数——匿名函数、推导式
    九、函数 —— 参数
    八、数据类型——bytes类型+set类型
    七、数据类型 —— 字典
    六、数据类型 —— 字符串
    五、数据类型 —— 元组
  • 原文地址:https://www.cnblogs.com/bb3q/p/4497205.html
Copyright © 2011-2022 走看看