冒泡排序:
相邻元素比较,符合条件交换位置,每轮比较会得到一个最大或者最小的值。数组有多少个元素就需要比较几轮,但是倒数一轮比较的时候数组已经排好序了,即最后一轮比较是多余的,因此共比较(arr.lenth-1)轮。每轮相邻元素比较(arr.lenth-1)次,由于每轮比较会冒出一个排好序的值,因此每轮又可以减少之前冒泡得到的元素,因此每轮只需要比较(arr.length-1-第几轮)次。实现如下:
package com.kf;
import java.util.Arrays;
/**
* 冒泡排序(相邻元素比较,每轮比较冒出一个最大或者最小的数。如果某一次没有交换位置则说明排序完成)
*
* @author LeiLei
* @date 2019/7/2
*/
public class BubbleSort {
/**
* 总共比较次数
*/
private static int count = 0;
/**
* 数组是否已经排序完成
*/
private static boolean haveSorted = true;
public static void main(String[] args) {
Integer[] arr = {3,9,4,5,2,1,8};
//Integer[] arr = {1,1,1,1,1,1,1};
//39 94 45 52 21 18
//94 45 52 21 18
//45 52 21 18
//52 21 18
//21 18
//18
//1+2+3+4+5+6 = 21次
System.out.println("排序前:"+Arrays.toString(arr));
int a = 0;
//数组长度
int length = arr.length;
//比较(arr.lenth-1)轮
for(int j = 0; j < length - 1;j++ ) {
haveSorted = true;
//每轮比较进行冒泡找出最大或最小值
for(int i = 0; i < length - 1 - j ; i++) {
count++;
if(arr[i] < arr[i+1]) {
Integer temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
haveSorted = false;
}
}
if(haveSorted) {
break;
}
}
System.out.println("排序后:"+Arrays.toString(arr));
System.out.println("总共比较次数:"+count);
}
}
优化:如果元素中的所有元素一样、或有得元素已经排好序,就会多出来很多无意义得比较。因此我加了一个haveSorted字段,假定每轮比较都是排好序得。如果进入if块则说明没有排好序,将haveSorted改为false。如果没有进入if块则说明数组已经排好序,则直接跳出循环,排序完成,这样就当元素有重复元素得时候或者数组已经有几个排好序得元素时效率会高很多。