冒泡排序及优化

算法简介
冒泡排序是每一位初学程序设计的人都会接触到的算法,其排序方式如它的名字一般,将每一个未排序的数按照升序或者降序像气泡一样逐一排列,最终得到一个有序序列。 

先看看下面的代码,一个最简单的冒泡排序。

public void bubble_1(int[] arr){
   int temp;

   for(int i=0;i<arr.length-1;i++){
      for(int j=i+1;j<arr.length;j++){
          if(arr[i]>arr[j]){
               temp = arr[i];
               arr[i] = arr[j];
               arr[j] = temp;
          }
     }
   }

}

执行过程如下:
这里写图片描述
注:图中当i等于1时指的是第一趟遍历时,即是上述代码中的外层循环i=0时,i=2同理。 

上述的冒泡排序不足之处:
此算法效率低下,排完序的数对后续的待排序数的排序操作没什么帮助,而且还有在排序过程中会发生将较小的数交换到数组末尾的情况(如图中的3与2交换时,3就被交换到了数组末尾)。

优化一

public void bubble_2(int[] arr){
     int temp;
     for(int i=0;i<arr.length-1;i++){
          for(int j=arr.length-1;j>i;j--){
               if(arr[j]<arr[j-1]){
                   temp = arr[j];
                   arr[j] = arr[j-1];
                   arr[j-1] = temp;
               }

           }
     }
}

执行过程如下:
这里写图片描述
此算法的好处在于,排序时候从后边开始,将较小者往前边移动。这样较小者会不断往前移动。解决了第一个算法,可能将较小者移到后边的情况,提高了算法效率。在上十万条数据的排序过程中,这种差异将会体现出来。

上述的冒泡排序不足之处:
如果是这样的数组{2,1,3,4,5,6,7,8,9} 也就是说,除了第一个和第二个关键字需要交换外,别的已经有序。按照第二种算法,算法将会对每个循环中的j都会执行一遍,即使只有比较数据,并没有交换数据。这个动作是大大多余的,所以可以改进。
优化二

  public void bubble_3(int[] arr){
     int temp;
     boolean flag = true;
     
     for(int i=0;i<arr.length-1&&flag;i++){
         flag = false;
         for(int j = arr.length-1;j>i;j--){
              if(arr[j]<arr[j-1]){
                 temp = arr[j];
                 arr[j] = arr[j-1];
                 arr[j-1] = temp;
                 
                 flag = true;
              }
         }
     }

 }

算法改进可以使用最常用的办法,那就是设置一个标记变量flag,当循环中没有交换数据时,算法将停止循环。执行结束。经过这样的改进,算法执行效率有了一定的提高,可以避免在已经有序的情况下的无意义的循环判断。

此文出处:https://blog.youkuaiyun.com/qq_25827845/article/details/50654467

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值