算法之冒泡排序

Posted 呲花是朵花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法之冒泡排序相关的知识,希望对你有一定的参考价值。

冒泡排序

思路:我想把9移动到最后面的位置,通过两两判断,如果前面的元素>后面的元素,交换两个值,循环8次才能放到最后。

public static void main(String[] args) { int[] arr = {5, 9, 7, 1, 3, 8, 2, 6, 4}; for (int j = 0; j < 8; j++) { if (arr[j] > arr[j+1]) { swap(arr, j, j + 1); } } print(arr); }
5 7 1 3 8 2 6 4 9 

然后我再循环7次,就可以把8放到倒数第二位,以此类推,每次循环递减,最后循环1次的时候完成所有元素的排序,所以在这个循环上套一层循环,依次递减

/** * 冒泡排序 */public class BubbleSort { public static void main(String[] args) { int[] arr = {5, 9, 7, 1, 3, 8, 2, 6, 4}; sort(arr); }
public static void sort(int[] arr) { for (int i = arr.length - 1; i > 0; i--) { for (int j = 0; j < i; j++) { if (arr[j] > arr[j+1]) { swap(arr, j, j+1); } } }
print(arr); }
/** * 交换元素位置 * @param arr 数组 * @param i 位置1 * @param j 位置2 */ static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
static void print(int arr[]) { Arrays.stream(arr).forEach(num->{ System.out.print(num + " "); }); System.out.println(); }}

但是这样写是有缺点的,假设我数组的值是这样的{1, 3, 2, 4, 5, 6, 7, 8, 9},从第三个位置开始,后面的元素都是有序的,那我第一次比较完发现没有交换过,那我下次就没必要再去比较了。

/** * 冒泡排序-优化 */public class BubbleSort1 { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
sort(arr); print(arr); }
public static void sort(int[] arr) { // 记录比较次数 int num = 0; // 记录交换次数 int swapNum = 0; // 初始化最后一次交换位置 默认为数组最后位置 int lastSwapedIndex = arr.length - 1; // lastSwapedIndex控制循环的边界,假如最后一次交换的位置是4,那我后面的位置就不去比较了 for (int i = lastSwapedIndex; i > 0; i--) { // 记录是否交换过,默认未交换 boolean swaped = false; for (int j = 0; j < i; j++) { if (arr[j] > arr[j+1]) { swap(arr, j, j + 1); // 标记交换过 swaped = true; // 更新最后交换的位置 lastSwapedIndex = j; swapNum ++; } num++; } if (!swaped) { break; } }
print(arr); System.out.println("比较"+(num)+"次"); System.out.println("交换"+(swapNum)+"次"); }
/** * 交换元素位置 * @param arr 数组 * @param i 位置1 * @param j 位置2 */ static void swap(int[] arr, int i, int j) { // 记录原最小值,用于和最小值互换 int temp = arr[i]; // 数组中原最小值换为新的最小值 arr[i] = arr[j]; // 最小值的位置换为原最小值 arr[j] = temp; }
static void print(int arr[]) { Arrays.stream(arr).forEach(num->{ System.out.print(num + " "); }); System.out.println(); }}

这样当数组有序的时候,节省很多判断,最好的情况时间复杂度为O(n),空间复杂度为O(1),因为不占用额外的空间。

推荐阅读

• • • 

以上是关于算法之冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之冒泡排序

Java排序算法之冒泡排序

重温基础算法内部排序之冒泡排序法

排序算法之——冒泡排序

排序算法之冒泡排序

python 数据结构与算法之排序(冒泡,选择,插入)