No bb . Show me the code

1. 简单实现

public static long sort(int[] intArr) {
        int  arrLen     = intArr.length;
        long recycleNum = 0;
        if (0 == arrLen) {
            return recycleNum;
        }
        for (int i = 0; i < arrLen; i++) {
            for (int j = 0; j < arrLen - 1; j++) {
                recycleNum++;
                // 左边是大(不是正常的排序顺序)的做交换
                if (intArr[j] > intArr[j + 1]) {
                    int temp = intArr[j];
                    intArr[j] = intArr[j + 1];
                    intArr[j + 1] = temp;
                }
            }
        }

        return recycleNum;
    }

考虑优化

2. 优化

/**
     * 冒泡排序-优化版本,节约有序的
     *
     * @param intArr
     */
    public static long sortPlus(int[] intArr) {
        // 第一轮,永远是找到最大的
        // 第二轮,找到的是第二大的,所以右边 n 个永远是有序的
        // 如果有一种特殊情况,右边经过对比,发现不需要交换了,那就是后面的都是最大的。 有一个不是前面对比最大的,就会发生交换

        // 加一个标记位,不发生交换的位置,就是比较的end
        // 这样 原则上 1,2,3,4,5,6,7,8 只需要比较一轮
        int  arrLen     = intArr.length;
        long recycleNum = 0;
        if (0 == arrLen) {
            return recycleNum;
        }
        boolean isSorted = true;
        for (int i = 0; i < arrLen; i++) {
            for (int j = 0; j < arrLen - 1; j++) {
                recycleNum++;
                // 左边是大(不是正常的排序顺序)的做交换
                if (intArr[j] > intArr[j + 1]) {
                    int temp = intArr[j];
                    intArr[j] = intArr[j + 1];
                    intArr[j + 1] = temp;
                    // 发生了交换
                    isSorted = false;
                }
            }
            // TODO mark 是不是 j 都遍历一遍 只是增加了 判断。 反而增加了逻辑判断
            if (isSorted) {
                break;
            }
        }
        return recycleNum;
    }

3. 有序区

/**
     * 冒泡排序-有序区
     *
     * @param intArr
     */
    public static long sortOrdered(int[] intArr) {
        int  arrLen            = intArr.length;
        int  lastExchangeIndex = arrLen;
        int  sortLen           = arrLen - 1;
        long recycleNum        = 0;
        if (0 == arrLen) {
            return recycleNum;
        }

        boolean isSorted = true;
        for (int i = 0; i < arrLen; i++) {
            for (int j = 0; j < sortLen; j++) {
                recycleNum++;
                // 左边是大(不是正常的排序顺序)的做交换
                if (intArr[j] > intArr[j + 1]) {
                    int temp = intArr[j];
                    intArr[j] = intArr[j + 1];
                    intArr[j + 1] = temp;
                    // 发生了交换
                    isSorted = false;

                    // 排序后的位置一定是有序的期间
                    lastExchangeIndex = j;
                }
            }

            // 节约空间,如果已经有序,不对比那么多,缩短长度
            // 为了不影响 j 循环,循环结束后引入新的变量
            sortLen = lastExchangeIndex;
            if (isSorted) {
                break;
            }
        }
        return recycleNum;
    }

4. 测试代码

/**
 * 循环次数,测试性能
 */
private static final int NUM = 1;

public static void main(String[] args) {
    //获取开始时间
    long startTime = System.currentTimeMillis();

    for (int i = 0; i < NUM; i++) {
        int[] intArr = new int[]{3, 4, 2, 1, 5, 6, 7, 8, 11};
        // 72
        //            long recycleNum = sort(intArr);
        // 72
        long recycleNum = sortPlus(intArr);
        // 11
        //            long recycleNum = sortOrdered(intArr);
        System.out.println("循环次数:" + recycleNum);
        //  System.out.println(Arrays.toString(intArr));
    }
    // 获取结束时间
    long endTime = System.currentTimeMillis();
    System.out.println("程序运行时间: " + (endTime - startTime) + "ms");
}

天真真不知路漫漫
70 声望6 粉丝

1