冒泡排序是一项入门的排序方法,最重要的是弄清楚它的编写思路,熟悉之后可以自己尝试优化。
刚接触时本人出现困惑的地方:
代码中外层循环和内层循环分别代表什么;
为什么是i < length-1、j< length-1-i。
注意:代码块中有详细的注解。
本人尝试优化的思路:
加入了一个flag标识位,除去比较已经有序排列的元素,减少没有意义的比较。
另外注意:代码里面也有一些关于Arrays类方法的使用。
package com.gao.method;
//它是数组的工具类,因为如果不使用它,似乎只有很少原生方法运用数组
import java.util.Arrays;
public class Demo01 {
public static void main(String[] args) {
int[] num = {1,8,5,9,7,3};
//调用自己的排序方法,我写的是降序
int[] num2 = sort(num);
System.out.println(Arrays.toString(num2));
//Arrays工具类的排序方法(升序),直接调用就可以,它的方法通过类就能调用
Arrays.sort(num2);
System.out.println(Arrays.toString(num2));
}
public static int[] sort(int[] num1){
//flag标识位,优化冒泡排序,能够发现是否排好序了,排好了就可以不用比较了。
boolean flag = false;
//定义一个临时变量,等下用来接收数据。
int temp = 0;
//外层循环控制的是冒泡排序的轮数:如四个元素比较三轮;五个元素比较四轮;六个元素比较五轮。
for (int i = 0; i < num1.length-1; i++) {
//内层循环控制的是每一轮需要比较的次数;
//因为比较过第一轮,就必定出现元素中的最大值或者最小值,所以到了第i轮,就要比较少i次。
for (int j = 0; j < num1.length-1-i; j++){
//降序排列——从大到小排列,升序排列只需要改:num1[j+1]<num1[j]
if (num1[j+1]>num1[j]){
temp = num1[j];
num1[j] = num1[j+1];
num1[j+1] = temp;
flag = true;
}
if (flag == false){
break;
}
}
}
return num1;
}
}