冒泡排序优化

冒泡排序

逻辑思想看注释

普通版:

//冒泡排序
public class BubbleSort {
    public static void sort(int[] arr){
        for (int i = arr.length-1; i >0 ; i--) {//外层循环:将边界向左移。(每排好一次,最右边就已经为最大的值了)
            for (int j = 0; j < i; j++) {//内层循环实现将最大数移到右边界
            	if (arr[j]>arr[j+1]){//判断是否满足交换的条件
                	TestUtils.swap(arr,j,j+1);//交换--这里是我自己封装的交换方法,方便观看整体逻辑。等同于下方注释内容
                    /*
                    arr[j]=arr[j] ^ arr[j+1];
                    arr[j+1]=arr[j] ^ arr[j+1];
                    arr[j]=arr[j] ^ arr[j+1];
                    */
            	}
        	}
        }
    }
}

优化后:加上了交换次数的判断条件

思想:如果某次循环后交换次数为0,则说明已经为有序,直接退出循环。

package com.zx.sort.bubbleSort;

import com.zx.sort.util.TestUtils;

import java.util.Arrays;

/**
 * @Description: com.zx.sort.bubbleSort
 * @version: 1.0
 */
//冒泡排序
public class BubbleSort {
    public static void sort(int[] arr){
        int index=1;//记录交换的次数,初始化为1,进入交换
        int time=0;//初始化循环的次数 测试输出-可以省略
        for (int i = arr.length-1; i >0 ; i--) {
            if (index!=0){
                //把最大数放最右边
                index = setMaxRight(arr, i, index);//返回交换的次数
                System.out.println("第"+(++time)+"次循环交换次数:"+index);//测试输出-可以省略
            }else {//说明已经排好序
                break;
            }
        }

    }
    //把最大数放最右边
    public static int setMaxRight(int[] arr,int right,int index){//right为数组右边界下标位置,默认为arr.length-1
        index=0;//每次进来时归零(刷新交换次数)
        for (int j = 0; j < right; j++) {
            if (arr[j]>arr[j+1]){
                TestUtils.swap(arr,j,j+1);//交换
                index++;//记录交换次数
            }
        }
        return index;
    }
}

原文地址:https://www.cnblogs.com/code-xu/p/14548971.html