2021-05-29 冒泡排序优化版

 public static void main(String[] args) {
        int len  = 20;
        int[] a = buildRandomArray(len);
        //int[] a = new int[]{1,2,3,4,5,6,7,8,9,10}; // 优化点1的情况
        //int[] a = new int[]{4,1,2,5,3,6,7,8,9,10}; // 优化点2的情况
        Arrays.stream(a).forEach(v-> System.out.print(v+" "));
        int lastSortedIndex = 0;
        int sortedBorder = len-1;
        for (int i = 0; i < len-1 ; i++) {
            boolean isSorted = true;
            for (int j = 0; j < sortedBorder; j++) {
                if (a[j] > a[j+1]){
                    int temp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = temp;
                    isSorted = false;    // 优化点1:考虑数组已经是有序的,如果遍历一次,发现没有发生交换,那数组就是有序的
                    lastSortedIndex = j; // 优化点2:考虑部分是是有序的,所以定个边界,防止重复比较
                }
            }
            sortedBorder  = lastSortedIndex;
            if (isSorted) break;
        }
        System.out.println();
        Arrays.stream(a).forEach(v-> System.out.print(v+" "));
    }

    public static int[] buildRandomArray(int len){
        if (len <= 0){
            return new int[]{0};
        }
        if (len > 20){
            len = 20;
        }
        int max = len * 10 ;
        Supplier<Integer> supplier =()->new Random().nextInt(max);
        int[] r = new int[len];
        for (int i = 0; i < len; i++) {
            r[i] = supplier.get();
        }
        return r;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容