冒泡排序及其优化
图解冒泡排序
- 算法排序步骤
-
依次比较相邻两个元素,如果第一个比第二个大,则交换两个元素位置。
-
对每一对相邻元素做同样的工作。直到最后一对。这样每次最后一对的元素排序后都是最大的。
-
重复以上步骤直到排序完成
- 基本算法实现
public static int[] sortTest(int[] arr){
int end = arr.length -1;
//外层for循环是循环的次数
for (int i = 0; i < arr.length; i++) {
//内层for循环是为了进行两两相邻元素比较。
// 外层循环每循环一次,都会产生一个最大元素。所以内层就会少比较一次
for (int j = 0; j < end-i; j++) {
//进行元素比较,较大的元素放后面。
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
优化思路:对外层或者内层循环进行次数优化。
- 针对外层循环做优化
如果在进行某一次外层循环时候发现本次内层循环中没有进行元素交换。则说明该数组已经有序。无需进行剩下次数的比较。即退出循环。代码实现如下
public static int[] sortYouHua( int[] arr){
int end = arr.length - 1;
//外层for循环是循环的次数
for (int i = 0; i < end; i++) {
System.out.println("第"+(i+1)+"趟");
//决定是否退出外层循环的标志位
boolean flag = true;
for (int j = 0; j < end-i; j++) {
//内层for循环是为了进行两两相邻元素比较。
// 外层循环每循环一次,都会产生一个最大元素。所以内层就会少比较一次
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = false;
}
System.out.println(" 第"+(j+1)+"次"+Arrays.toString(arr));
}
//进入到该条件说明数组已经有序。无需排序,跳出循环即可。
if(flag){
break;
}
}
return arr;
}
- 在外层优化基础上对内层循环进行优化
在每进行一次外层循环后都会产生一个最大元素。我们记录下此时内层循环的下标。并将下一次内层循环的结束下标设置为之前记录的下标。
public static int[] sortYouHuaByPos( int[] arr){
int end = arr.length - 1;
int lastIndex = 0;
for (int i = 0; i < arr.length - 1; i++) {
boolean flag = true;
for (int j = 0; j < end; j++) {
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = false;
//记录循环排序后的最大下标
lastIndex = j;
}
System.out.println(" 第"+(j+1)+"次"+Arrays.toString(arr));
}
//将下标赋值给内层循环结束条件
end = lastIndex;
if(flag){
break;
}
}
return arr;
}
如有错误,希望大佬批评指正!