原理分析
/** * 冒泡排序 * 排序:默认是正序,从小到大排序 * 原理: 从下往上排序, 叫做从前往后排序, 如果前面的数比后面的数大,则交换2个数的位置 * 元素个数为; N * 外层循环: 比较的总趟数 N-1, 每趟数为: i(从0开始) * 内层循环: 无序区范围大小 N-i-1, 也可以理解为:一趟中比较的次数,注意: 指针指向的数从0开始, 最后一个数据不用比较, * 代码关键点: 趟, 无序区范围 * 优化: 如果冒泡排序中的一趟排序没有发生交换,则说明列表已经有序,可以直接结束算法 * @param arr */
代码如下:
package com.company; import java.util.Arrays; public class Main { public static void main(String[] args) { System.out.println(1); int[] arr = {7, 2, 5, 8, 1, 3, 6, 9, 4}; dubbleSort(arr); } /** * 冒泡排序 * 原理: 从下往上排序, 叫做从前往后排序, 如果前面的数比后面的数大,则交换2个数的位置 * 元素个数为; N * 外层循环: 比较的总趟数 N-1, 每趟数为: i(从0开始) * 内层循环: 无序区范围大小 N-i-1, 也可以理解为:一趟中比较的次数,注意: 指针指向的数从0开始, 最后一个数据不用比较, * 代码关键点: 趟, 无序区范围 * 优化: 如果冒泡排序中的一趟排序没有发生交换,则说明列表已经有序,可以直接结束算法 * @param arr */ public static void dubbleSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { boolean flag = false; for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; flag = true; } } System.out.println(Arrays.toString(arr)); if (!flag){ return; } } } }
运行结果:
算法复杂度
因为是2层循环,也没有折半,所以是: O(n² )
完成