JAVA算法:冒泡排序

冒泡排序(Bubble Sort)

  • 简介:
    冒泡排序是一种简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
    越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列)故名“冒泡排序”。
    冒泡排序为非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
  • 原理:

    1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    3.针对所有的元素重复以上的步骤,除了最后一个。
    4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

  • 示例:
    public static void main(String[] args) {
          int[] array = new int[]{9, 5, 8, 4, 3, 7, 6, 1, 0, 2};
          print("->排序前:", array);
          //第一层循环表示冒泡比较的轮数(2个数只需要比较1轮,3个数只需要比较2轮)
          //所以只需要比较 array.length - 1 轮.
          for (int i = 0; i < array.length - 1; i++) {
              //第二层循环表示本轮所需要比较的次数
              //每一轮循环都会有一个较大值冒上来,仅需要比较其他其他较小的值, 所以需要比较 array.length - i - 1 次
              for (int j = 0; j < array.length - i - 1; j++) {
                  if (array[j] > array[j + 1]) {
                      int tem = array[j];
                      array[j] = array[j + 1];
                      array[j + 1] = tem;
                  }
              }
          }
          print("->排序后:", array);
    }
    
    输出结果:
      ->排序前:9,5,8,4,3,7,6,1,0,2
      ->排序后:0,1,2,3,4,5,6,7,8,9
    
  • 冒泡排序优化:
    public static void sort(int[] arr) {
           //设置变量的初始值
           int low = 0;
           int high = arr.length - 1;
           while (low < high) {
               int f1 = 0, f2 = 0;
               //每趟开始时,无记录交换
               //正向冒泡,找到最大者
               for (int i = low; i < high; ++i) {
                   if (arr[i] > arr[i + 1]) {
                       int tmp = arr[i];
                       arr[i] = arr[i + 1];
                       arr[i + 1] = tmp;
                       f1 = i;
                   }
               }
               // 记录上次位置
               high = f1;
               //反向冒泡,找到最小者
               for (int j = high; j > low; --j) {
                   if (arr[j] < arr[j - 1]) {
                       int tmp = arr[j];
                       arr[j] = arr[j - 1];
                       arr[j - 1] = tmp;
                       f2 = j;
                   }
               }
               //修改low值
               low = f2;
           }
       }
    public static void main(String[] args) {
           int[] array = new int[]{9, 5, 8, 4, 3, 7, 6, 1, 0, 2};
           print("->排序前:", array);
           sort(array);
           print("->排序后:", array);
       }
    
    输出结果:
      ->排序前:9,5,8,4,3,7,6,1,0,2
      ->排序后:0,1,2,3,4,5,6,7,8,9
    
    冒泡排序优化代码引用自:Java实现经典排序算法----1、冒泡排序
  • 口诀:
    外层循环 n-1 (比较轮数)
    内层循环 n-1-i (每一轮所比较的次数)
    两两比较做交换
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值