冒泡排序优化
冒泡排序
逻辑思想看注释
普通版:
//冒泡排序
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;
}
}