排序

119 阅读1分钟

插入排序

时间复杂度为O(n^2)

public static void sort(int[] arr){
    int temp;
    for(int i = 1; i < arr.length; i++){        temp = arr[i];        int j = i;
        for(; j>0 && arr[j-1]>temp;j--){            // 大于temp的数都往右移动
            arr[j] = arr[j-1];        }
        //将当前位置放入合适的值
        arr[j] = temp;    }
}

冒泡排序 

时间复杂度:O(n) ~ O(n²)

空间复杂度:O(n)

    public static void sort(int[] array) {
        if (array == null || array.length == 0) {
            return;
        }

        int length = array.length;
        //外层:需要length-1次循环比较
        for (int i = 0; i < length - 1; i++) {
            //内层:每次循环需要两两比较的次数,每次比较后,都会将当前最大的数放到最后位置,所以每次比较次数递减一次
            for (int j = 0; j < length - 1 - i; j++) {
                if (array[j] > array[j+1]) {
                    //交换数组array的j和j+1位置的数据
                    swapByTemp(array, j, j+1);
                }
            }
        }
    }


    /**
     * 通过临时变量交换数组array的i和j位置的数据
     */
    public static void swapByTemp(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    /**
     * 通过算术法交换数组array的i和j位置的数据(有可能溢出)
     */
    public static void  swapByArithmetic(int[] array, int i, int j) {
        array[i] = array[i] + array[j];
        array[j] = array[i] - array[j];
        array[i] = array[i] - array[j];
    }


    /**
     * 通过位运算法交换数组array的i和j位置的数据
     */
    public static void  swapByBitOperation(int[] array, int i, int j) {
        array[i] = array[i]^array[j];
        array[j] = array[i]^array[j]; //array[i]^array[j]^array[j]=array[i]
        array[i] = array[i]^array[j]; //array[i]^array[j]^array[i]=array[j]
    }

参考:

8种排序