冒泡排序算法分析及优化

package com.ysh.demo;
import org.junit.Test;
import java.util.Arrays;

/*
      冒泡排序:
     一个数组冒泡,如果左边数字大于右边数字,那么交换位置。
     数组:
     arr = {1,2,3},
     分析:
     第一次:确定一个最大值,排在数组的最后一位,需要比较的次数为arr,length-1-i,i为外循环的计数
     第二次:确认数组倒数第二位,需要比较的次数为arr,length-1-i
     ...

     总结:
     只需要内外两个循环即可。
     for (int i = 0; i<arr.length-1;i++){
        for (int j = 0;j<arr.length-i-1;j++){}
     }

 */

public class SortSet {

    public static void main(String[] args) {
        int[] arr = {0,2,3,1,2,4,5,0,8};
        //定义临时变量,用于交换
        int temp = 0;
        //外循环,次数为数组长度-1
        for (int i=0; i<arr.length-1;i++){
            //内循环组长度-1-i,
            for (int j = 0;j<arr.length-i-1;j++){
                if (arr[j]>=arr[j+1]){

                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }

    }

    /*
    冒泡算法优化
    引入计数器
     */

    @Test
    public void bubbleAdvance(){
        int[] arr = {0,1,2,3,5,4};
        //定义临时变量,用于交换
        int temp=0;
        //定义标志位
        boolean flag;
        //外循环,次数为数组长度-1
        for (int i = 0; i<arr.length-1;i++){
            flag=true;
            //内循环组长度-1-i,
            for (int j = 0;j<arr.length-i-1;j++){
                if (arr[j]>arr[j+1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    flag=false;
                }
            }
            if (flag){
                System.out.println("第"+i+"次循环,排序结束");
                System.out.println(Arrays.toString(arr));
                return;
            }
        }
    }
}

  

忘了他,我撸代码养你
原文地址:https://www.cnblogs.com/theworld/p/12110935.html