冒泡排序是一种稳定排序,值相等的元素并不会打乱原本的顺序。
由于该排序算法的每一轮都要遍历所有元素吗,总共遍历(元素数量-1)轮,所以平均的时间复杂度是O(n2).
/** * @Author: subd * @Date: 2019/8/16 8:19 */ public class BubbleSort { public static void main(String[] args) { int[] array = new int[]{5, 8, 6, 3, 9, 1, 2, 7}; sort1(array); System.out.println(Arrays.toString(array)); array = new int[]{5, 8, 6, 3, 9, 1, 2, 7}; sort2(array); System.out.println(Arrays.toString(array)); array = new int[]{3, 4, 2, 1, 5, 6, 7, 8}; sort3(array); System.out.println(Arrays.toString(array)); } /** * 冒泡第一版 * * @param array */ private static void sort1(int[] array) { int tims = 0; for (int i = 0; i < array.length - 1; i++) { for (int j = 0; j < array.length - i - 1; j++) { int tmp = 0; if (array[j] > array[j + 1]) { tmp = array[j]; array[j] = array[j + 1]; array[j + 1] = tmp; } tims++; } } System.out.println("遍历次数:" + tims); } /** * 冒泡第二版 加入验证有序 * * @param array */ private static void sort2(int[] array) { int tims = 0; for (int i = 0; i < array.length - 1; i++) { //有序标记,每一轮的初始值都是true; boolean isSorted = true; for (int j = 0; j < array.length - i - 1; j++) { int tmp = 0; if (array[j] > array[j + 1]) { tmp = array[j]; array[j] = array[j + 1]; array[j + 1] = tmp; //因为有元素进行交换,所以不是有序的,标记变为false isSorted = false; } tims++; } //如果有序跳出本次循环。 if (isSorted) { break; } } System.out.println("遍历次数:" + tims); } /** * 冒泡第三版 加入验证有序区 * * @param array */ private static void sort3(int[] array) { int tims = 0; for (int i = 0; i < array.length - 1; i++) { //有序标记,每一轮的初始值都是true; boolean isSorted = true; //无序数列的边界,每次比较只需要比较到这里为止。 int sortBorder = array.length - 1; for (int j = 0; j < array.length - i - 1; j++) { int tmp = 0; if (array[j] > array[j + 1]) { tmp = array[j]; array[j] = array[j + 1]; array[j + 1] = tmp; //因为有元素进行交换,所以不是有序的,标记变为false isSorted = false; //把无序数列的边界更新为最后一次交换元素的位置。 sortBorder = j; } tims++; } //如果有序跳出本次循环。 if (isSorted) { break; } } System.out.println("遍历次数:" + tims); } }