选择、冒泡、插入排序

40 阅读1分钟

SelectionSort

in - 1 范围上,找到最小值并放到 i 位置上,然后在 i + 1n - 1范围上继续. 也就是说从头到尾遍历,找到最小的放到第一位,然后从第二位开始遍历到最后,还是找到最小的,放到第二个位置,依次类推。

public static void sort(int[] arr) {
    if (arr == null || arr.length < 2) {
        return;
    }
    for (int i = 0; i < arr.length - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        SortUtils.swap(arr, i, minIndex);
    }
}

BubbleSort

0 ~ i 位置上,相邻位置较大的数往后移,最大值最终来到 i 位置,然后 0 ~ i - 1位置继续。

Sort.java

public static void sort(int[] arr) {
    if (arr == null || arr.length < 2) {
        return;
    }
    for (int end = arr.length - 1; end > 0; end--) {
        for (int j = 0; j < end; j++) {
            if (arr[j + 1] < arr[j]) {
                SortUtils.swap(arr, j, j + 1);
            }
        }
    }
}

InsertionSort

0 ~ i 范围上已经有序,新来的数从右往左滑到不再小的位置插入,然后继续。就像打牌一样,比如左手拿着五张牌,是顺子,然后右手又摸了一张牌,这时就需要把新摸的牌放到正确的位置。

public static void sort(int[] arr) {
    if (arr == null || arr.length < 2) {
        return;
    }
    for (int i = 1; i < arr.length; i++) {
        for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
            SortUtils.swap(arr, j, j + 1);
        }
    }
}

这里边的 j + 1 始终指向新来的数,新来的数跑到那,j + 1 就跟到哪,j 永远是新来数前一个位置。

Test Code

App.java

public static void main(String[] args) {
    int[] arr = {3, 1, 2, 4, 7, 6};
    sort(arr);
    for (int i = 0; i < arr.length; i++) {
        System.out.println(arr[i]);
    }
}
1
2
3
4
6
7