JAVA—数组冒泡排序
冒泡排序算法的原理如下(原理来源于度娘):
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
图解冒泡排序:
代码实现
public static void main(String[] args) {
int[] arr = {2,5,43,23,12};
//通过Arrays工具类输出数组(与冒泡无关,就是遍历数组)
System.out.println("排序之前:" + Arrays.toString(arr));
int count = 0; //初始化比较的次数为0
//定义第三个空间,用来交换数值,这个也可以定义在循环里,最好定义在循环外面,
// 因为如果定义在循环里,每次循环会开辟一次空间,浪费内存
int t;
//初始一个布尔变量(如果比较几次就比较出顺序了,就没有必要进行那么多次比较了,定义个布尔量判断是否还没比较完就已经排好序了)
boolean flag;
//控制的是比较几轮(如果对控制条件不明白,请手写画图研究)
for (int i = 1; i < arr.length; i++){
//给布尔量赋值true,如果走下面的循环里的交换语句,就会被赋值为false,如果不走就是已经排序好了, 没必要再次进行比较了
flag = true;
//控制的是每轮的比较次数
for (int j = 0; j < arr.length - i; j++){
count++; //比较一次,计数器加1
if (arr[j] > arr[j + 1]){ //如果前面的数值大,就进行交换数值
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
//如果进行交换就把flag赋值为flase
flag = false;
}
}
//如果是true,证明已经排序好了,没有必要进行多余的比较了,break终止循环
if (flag){
break;
}
}
System.out.println("比较次数:" + count);
System.out.println("排序之后:" + Arrays.toString(arr)); //输出:排序之后:[2, 5, 12, 23, 43]
}