package sorts;

import java.util.Arrays;

/**
 * 冒泡排序、插入排序、选择排序
 * <p>
 * Author: Zheng
 */
public class Sorts {

    // 冒泡排序，a是数组，n表示数组大小
    public static void bubbleSort(int[] a, int n) {
        if (n <= 1) return;

        for (int i = 0; i < n; ++i) {
            // 提前退出标志位
            boolean flag = false;
            for (int j = 0; j < n - i - 1; ++j) {
                if (a[j] > a[j + 1]) { // 交换
                    int tmp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = tmp;
                    // 此次冒泡有数据交换
                    flag = true;
                }
            }
            if (!flag) break;  // 没有数据交换，提前退出
        }
    }

    //冒泡排序改进
    public static void bubbleSort2(int[] a, int n) {
        if (n <= 1) return;

        // 最后一次交换的位置
        int lastExchange = 0;
        // 无序数据的边界,每次只需要比较到这里即可退出
        int sortBorder = n - 1;
        for (int i = 0; i < n; i++) {
            // 提前退出标志位
            boolean flag = false;
            for (int j = 0; j < sortBorder; j++) {
                if (a[j] > a[j + 1]) {
                    int tmp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = tmp;
                    // 此次冒泡有数据交换
                    flag = true;
                    // 更新最后一次交换的位置
                    lastExchange = j;
                }
            }
            sortBorder = lastExchange;
            if (!flag) break;    // 没有数据交换，提前退出
        }
    }

    // 插入排序，a表示数组，n表示数组大小
    public static void insertionSort(int[] a, int n) {
        if (n <= 1) return;

        for (int i = 1; i < n; ++i) {
            int value = a[i];
            int j = i - 1;
            // 查找要插入的位置并移动数据
            for (; j >= 0; --j) {
                if (a[j] > value) {
                    a[j + 1] = a[j];
                } else {
                    break;
                }
            }
            a[j + 1] = value;
        }
    }

    // 选择排序，a表示数组，n表示数组大小
    public static void selectionSort(int[] a, int n) {
        if (n <= 1) return;

        for (int i = 0; i < n - 1; ++i) {
            // 查找最小值
            int minIndex = i;
            for (int j = i + 1; j < n; ++j) {
                if (a[j] < a[minIndex]) {
                    minIndex = j;
                }
            }

            // 交换
            int tmp = a[i];
            a[i] = a[minIndex];
            a[minIndex] = tmp;
        }
    }

    public static void main(String[] args) {
        int[] array = new int[]{3, 4, 2, 1, 5, 6, 7, 8};
        bubbleSort2(array, array.length);
        System.out.println(Arrays.toString(array));
    }
}

@@ -682,15 +682,92 @@
    /
-/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F%E6%94%B9%E8%BF%9B
+**%0A     * %E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F%E6%94%B9%E8%BF%9B:%E5%9C%A8%E6%AF%8F%E4%B8%80%E8%BD%AE%E6%8E%92%E5%BA%8F%E5%90%8E%E8%AE%B0%E5%BD%95%E6%9C%80%E5%90%8E%E4%B8%80%E6%AC%A1%E5%85%83%E7%B4%A0%E4%BA%A4%E6%8D%A2%E7%9A%84%E4%BD%8D%E7%BD%AE,%E4%BD%9C%E4%B8%BA%E4%B8%8B%E6%AC%A1%E6%AF%94%E8%BE%83%E7%9A%84%E8%BE%B9%E7%95%8C,%0A     * %E5%AF%B9%E4%BA%8E%E8%BE%B9%E7%95%8C%E5%A4%96%E7%9A%84%E5%85%83%E7%B4%A0%E5%9C%A8%E4%B8%8B%E6%AC%A1%E5%BE%AA%E7%8E%AF%E4%B8%AD%E6%97%A0%E9%9C%80%E6%AF%94%E8%BE%83.%0A     */ 
 %0A   

添加bubbleSort2方法注释