0
点赞
收藏
分享

微信扫一扫

Java冒泡排序的改进,使用最少的循环进行排序


一、概述:

冒泡排序(英语:Bubble Sort)又称为泡式排序,是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

二、排序版本

1.0 版:无优化

public static void bubbleSort_v1(int[] arr){
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1; j++) {
                if(arr[j ] > arr[j + 1]){
                    swap(arr, j , j+1);
                }
            }
            System.out.println("第" + i + "轮冒泡====" + Arrays.toString(arr));
        }
    }

2.0 版:内循环减少遍历次数 ( j < arr.length - 1 - i)

public static void bubbleSort_v2(int[] arr){
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if(arr[j ] > arr[j + 1]){
                    swap(arr, j , j+1);
                }
            }
            System.out.println("第" + i + "轮冒泡====" + Arrays.toString(arr));
        }
    }

3.0 版:使用布尔变量记录最后是否交换过,如果没交换,说明排序完成,跳出外循环

public static void bubbleSort_v3(int[] arr){
    for (int i = 0; i < arr.length - 1; i++) {
        boolean swap = false;
        for (int j = 0; j < arr.length - 1 - i; j++) {
            if(arr[j ] > arr[j + 1]){
                swap(arr, j , j+1);
                swap = true;
            }
        }

        System.out.println("第" + i + "轮冒泡====" + Arrays.toString(arr));

        if(!swap){
            break;
        }
    }
}

4.0 版:使用变量记录最后交换的索引,如果为0,说明交换完成,退出外循环

public static void bubbleSort_v4(int[] arr){
        int n = arr.length - 1;
        while (true){
            //记录最后一次交换
            int last = 0;
            for (int i = 0; i < n; i++) {
                if(arr[i] > arr[i + 1]){
                    swap(arr, i, i+1);
                    last = i;
                }
            }
            n = last;
            if(n == 0){
                break;
            }
        }
    }

交换函数:

private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }


举报

相关推荐

0 条评论