设计思路
根据字义就能理解他是相邻的两个数进行比较,比较的结果在与下个进行比较。两次for循环,外循环控制轮数,内循环代表每一轮的冒泡处理,先进行元素比较,在进行元素交换。
java代码:
public class Test {
//冒泡排序
public static void main(String[] args) {
int[] arr = new int[]{1,2,7,4,8};
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < arr.length - i; j++) {
if(arr[j] > arr[j + 1]) {
int temp;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
冒泡排序优化
通过标记判断下面的数是有序的可以直接跳出循环,减少循环的次数。
代码如下:
package com.company.arrays;
import java.util.Arrays;
/**
* <br>
* <b>类说明: </b> 冒泡排序调优偏第一版
* <b>作者: </b> Guo.shiLin
* <b>日期: </b> 2018\7\26 0026
*
* @version 1.0
*/
public class Sort1 {
public static void main(String[] args) {
int[] arrays = {13, 34, 12, 45, 10, 11, 56, 342, 112, 22, 33, 142};
long startTime = System.currentTimeMillis();
for (int i = 1; i < arrays.length; i++) {
//标记,有序集合每次都是true
boolean flag = true;
for (int j = 0; j < arrays.length - i; j++) {
if (arrays[j] > arrays[j + 1]) {
int temp;
temp = arrays[j + 1];
arrays[j + 1] = arrays[j];
arrays[j] = temp;
//没有序的标记false
flag = false;
}
}
if (flag) {
break;
}
}
long endTime = System.currentTimeMillis() - startTime;
System.out.println("消耗时间:" + endTime + "ms");
System.out.println(Arrays.toString(arrays));
}
}
上面只是做了一个简单的优化,我们还可以深度去优化。可以通过有序边界,和无序 边界来进行优化。
代码如下:
package com.company.arrays;
import java.util.Arrays;
/**
* <br>
* <b>类说明: </b> 冒泡排序调优第二篇
* <b>作者: </b> Guo.shiLin
* <b>日期: </b> 2018\7\26 0026
*
* @version 1.0
*/
public class Sort2 {
public static void main(String[] args) {
int[] arrays = {13, 34, 12, 45, 10, 11, 56, 342, 112, 22, 33, 142};
//无序数列的边界,每次比较只需要比到这里为止
int sortBorder = arrays.length - 1;
//记录最后一次交换的位置
int lastExchangeIndex = 0;
long startTime = System.currentTimeMillis();
for (int i = 0; i < arrays.length; i++) {
//标记,每一轮都标记为true。
boolean flag = true;
for (int j = 0; j < sortBorder; j++) {
if (arrays[j] > arrays[j + 1]) {
int temp;
temp = arrays[j + 1];
arrays[j + 1] = arrays[j];
arrays[j] = temp;
//无序标记为false
flag = false;
lastExchangeIndex = j;
}
}
//有序的直接结束
if (flag) {
break;
}
sortBorder = lastExchangeIndex;
}
long endTime = System.currentTimeMillis() - startTime;
System.out.println("消耗时间:" + endTime + "ms");
System.out.println(Arrays.toString(arrays));
}
}