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

    1.算法步

      比较相邻的两个元素,如果第一个比第二个大,就交换他们两个的位置。

      对每一对相邻元素作同样的工作。从开始的第一对到结尾的最后一对。这步做完后,最后的元素会成为最大的数。

      针对所有的元素重复以上的步骤,除了最后一个。

      持续每次对越来越少的元素重复上面的步骤,指导没有任何一对数字需要比较。

    2.举例说明

       要排序数组:int[] arr={6,3,8,2,9,1};   

    第一趟排序:

        第一次排序:6和3比较,6大于3,交换位置:  3  6  8  2  9  1

        第二次排序:6和8比较,6小于8,不交换位置:3  6  8  2  9  1

        第三次排序:8和2比较,8大于2,交换位置:  3  6  2  8  9  1

        第四次排序:8和9比较,8小于9,不交换位置:3  6  2  8  9  1

        第五次排序:9和1比较:9大于1,交换位置:  3  6  2  8  1  9

        第一趟总共进行了5次比较, 排序结果:      3  6  2  8  1  9

    ---------------------------------------------------------------------

    第二趟排序:

        第一次排序:3和6比较,3小于6,不交换位置:3  6  2  8  1  9

        第二次排序:6和2比较,6大于2,交换位置:  3  2  6  8  1  9

        第三次排序:6和8比较,6大于8,不交换位置:3  2  6  8  1  9

        第四次排序:8和1比较,8大于1,交换位置:  3  2  6  1  8  9

        第二趟总共进行了4次比较, 排序结果:      3  2  6  1  8  9

    ---------------------------------------------------------------------

    第三趟排序:

        第一次排序:3和2比较,3大于2,交换位置:  2  3  6  1  8  9

        第二次排序:3和6比较,3小于6,不交换位置:2  3  6  1  8  9

        第三次排序:6和1比较,6大于1,交换位置:  2  3  1  6  8  9

        第二趟总共进行了3次比较, 排序结果:         2  3  1  6  8  9

    ---------------------------------------------------------------------

    第四趟排序:

        第一次排序:2和3比较,2小于3,不交换位置:2  3  1  6  8  9

        第二次排序:3和1比较,3大于1,交换位置:  2  1  3  6  8  9

        第二趟总共进行了2次比较, 排序结果:        2  1  3  6  8  9

    ---------------------------------------------------------------------

    第五趟排序:

        第一次排序:2和1比较,2大于1,交换位置:  1  2  3  6  8  9

        第二趟总共进行了1次比较, 排序结果:  1  2  3  6  8  9

    ---------------------------------------------------------------------

    最终结果:1  2  3  6  8  9

    3.代码展示

      

     1 //java代码实现
     2 public class bubbleSort implements IArraySort{
     3 
     4     @Override
     5     public int[] sort(int[] sourceArray) {
     6         //对arr进行拷贝,但不改变参数内容
     7         int[] arr = Arrays.copyOf(sourceArray,sourceArray.length);
     8         
     9         for(int i = 1;i < arr.length ; i++){
    10             //设定一个标记,若为true,则表示此次循环没有进行交换
    11             boolean flag = true;
    12             
    13             for(int j = 0;j < arr.length-i; j++){
    14                 //判断相邻两个数的值大小
    15                 if(arr[j] > arr[j+1]){
    16                     //为true,则交换位置
    17                     int temp = arr[j+1];
    18                     arr[j+1] = arr[j];
    19                     arr[j] = temp;
    20                     
    21                     flag = false;
    22                 }
    23             }
    24             if (flag){
    25                 break;
    26             }
    27         }
    28         
    29         
    30         return arr;
    31     }
    32     
    33 }

    4.冒泡排序的优点

      每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,每进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。

    5.冒泡排序的时间复杂度

      1.如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。

        2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

      冒泡排序的最坏时间复杂度为:O(n2) 。

      综上所述:冒泡排序总的平均时间复杂度为:O(n2) 。

  • 相关阅读:
    正式搬家到博客园
    (SQL 技术篇)主键,外键,唯一约束,check约束
    Firefox 多个版本共存
    HTML5的视频格式之争
    jquery 提示简单效果插件 cluetip
    C# GUID的使用
    免费的jquery ui 收集
    js 验证身份证号码
    加速Web开发的9款知名HTML5框架
    Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
  • 原文地址:https://www.cnblogs.com/xiaofantongxue/p/10441412.html
Copyright © 2011-2022 走看看