冒泡排序及其优化

Posted 心迹背包客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序及其优化相关的知识,希望对你有一定的参考价值。

冒泡排序

  冒泡排序是一种比较经典的排序方法。相对简单排序做了进一步的改善。

冒泡排序的原理:

  通过对数组中相邻的值两两进行比较,将比较中得到的相对比较大的值交换到数值的前面,就像冒泡一样。

 

在冒泡排序的基础上,可以进一步的进行优化。

  优化一:交换位置时,不采用中间临时变量进行交互。

  优化二:采用标志位,当某一次遍历中发现无进行交互时,则证明该数组已经排序结束,可直接不对剩下未完成的比较进行遍历,直接结束。

  优化三:采用头尾两段同时开始的方法

 

  例如该例子中,采用普通的冒泡排序需要比较28次,但优化后的冒泡排序执行22次便完成所有的排序。

例子:

public class BubbleSort {

 

    public static void main(String[] args) {

 

       int[] values = new int[]{3,5,7,9,8,6,4,2};

//     bubble_sort(values);

       bubble_sort_optimized(values);

      

       for (int i : values) {

           System.out.print(i+",");

       }

 

    }

    / **

     * 冒泡排序:

     * 临近数据两两比较,按从大到小或从小到大排序

     *

     *

     * @param values

     */

    private static void bubble_sort(int[] values){

      

       int temp;

       for(int i = 0;i < values.length;i++){

           for(int j = values.length -1;j > i;j--){

              if(values[j]>values[j-1]){

                  temp = values[j];

                  values[j] = values[j-1];

                  values[j -1] = temp;

              }

           }

       }

    }

 

    / **

     * 冒泡排序优化:引入判断标志位

     * 优化一:不引入临时变量作为交换变量

     * 优化二:引入标志位,当发现一个遍历中并没进行交换,说明该排序已经完全排序好了

     *

     * @param values

     * /

    private static void bubble_sort_optimized_isSort(int[] values){

      

       boolean isSort = true;

      

       for(int i = values.length -1;i > 0;i--){

           isSort = true;

           for(int j = 0;j < i;j++){

              if(values[j] < values[j+1]){

                  Swap(values, j);

                 

                  isSort = false;

              }

           }

          

           if(isSort)

              break;

       }

    }

 

   

   

    / **

     * 冒泡排序优化:引入索引标志位

     * 优化一:通过引入索引标志位

     * pos为索引设为最大值,当pos发生改变后,则为冒泡的位置,若未发生改变,则代表排序已经结束

     *

     * @param values

     */

    private static void bubble_sort_optimized_pos(int[] values){

      

       for(int i = 0; i > values.length-1 ;){

           for(int j = values.length -1; j> i;j--){

              int pos = values.length;

              if(values[j] < values[j+1]){

                  pos = j;

                  Swap(values, j);

              }

             

              i = pos;

           }

       }

    }

   

    / **

     * 冒泡排序优化:头尾两边同时进行

     * 优化一:头尾两边同时进行排序,节省重新来回查找时间。

     *

     * @param values

     */

    private static void bubble_sort_optimized_beginEnd(int[] values){

      

       int iBegin = 0;

       int iEnd = values.length -1;

      

       while(iBegin < iEnd){

           for(int i = iBegin;i<</span>iEnd-1;i++){

              if(values[i] < values[i+1]){

                  Swap(values, i);

              }

           }

           iBegin++;

          

           for(int i = iEnd-1; i>iBegin;i--){

              if(values[i] < values[i+1]){

                  Swap(values, i);

              }

           }

           iEnd--;

       }

    }

   

   

    private static void Swap(int[] values, int j) {

       values[j] += values[j+1];

       values[j+1] = values[j] - values[j+1];

       values[j] = values[j] - values[j+1];

    }

}


以上是关于冒泡排序及其优化的主要内容,如果未能解决你的问题,请参考以下文章

十大经典排序--冒泡排序及其优化

交换排序------冒泡法 及其优化

冒泡排序算法及其两种优化

排序算法入门之冒泡排序及其优化(java实现)

细说冒泡排序及其五种优化算法

Java_冒泡排序_原理及优化