package com.ncst.sort;


/**
 * @author i
 * @create 2019/12/24 16:39
 * @Description 排序
 * 冒泡排序
 */
public class Sorts {

    /***
     *  冒泡排序
     *  案例: 6 5 4 3 1 2
     *  第一轮
     *      第一次 5 6 4 3 1 2
     *      第二次 5 4 6 3 1 2
     *      第三次 5 4 3 6 1 2
     *      第四次 5 4 3 1 6 2
     *      第五次 5 4 3 1 2 6
     *  第二轮
     *      第一次 4 5 3 1 2 6
     *      第二次 4 3 5 1 2 6
     *      第三次 4 3 1 5 2 6
     *      第四次 4 3 1 2 5 6
     *  第三轮
     *      第一次 3 4 1 2 5 6
     *      第二次 3 1 4 2 5 6
     *      第三次 3 1 2 4 5 6
     *      第四次 3 1 2 4 5 6
     *  第四轮
     *      第一次 1 3 2 4 5 6
     *      第二次 1 2 3 4 5 6
     *      第三次 1 2 3 4 5 6(这里设置一个判断 如果有一次不进行排序 那么整个数组的数据就是有序的)
     *  排序的思想: 两个相邻的元素进行比较,每次选出最大的元素移动至最后 经过多***作后 就可以得到一个有序的数组了
     * @param array
     */
    public static void bubbleSort(int[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            boolean flag = true;
            for (int j = 0; j < array.length - i - 1; j++) {
                if (array[j] > array[j + 1]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    flag = false;
                }
            }
            if (flag)
                break;
            ;
        }
    }


    /***
     * 插入排序
     *   数据:6 5 4 3 1 2
     *   第一轮:
     *     第一次:5 6 4 3 1 2   i=1 j=0
     *   第二轮
     *     第一次:4 5 6 3 1 2   i=2 j=1
     *   第三轮
     *     第一次:3 4 5 6 1 2   i=3 j=2
     *   第四轮
     *     第一次  1 3 4 5 6 2   i=4 j=3
     *   第五轮
     *     第一次  1 2 3 4 5 6   i=5 j=4
     *  思路 将要排序的数组 分成已排序和未排序  每次从未排序中取出一个元素 插入到已排序数组对应位置
     * @param array
     *
     */
    public static void insertSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int value = array[i];
            int j = i - 1;
            for (; j >= 0; j--) {
                if (array[j] > value) {
                    array[j+1] = array[j];
                } else {
                    break;
                }
            }
            array[j + 1] = value;
        }
    }

    /***
     *  选择排序
     *  思路:通过将数组分为已拍好序的数组和未拍好序的数组 分为两组 每次从未拍好序的数组中选择出最小的数 放到已拍好序的数组中
     *  思想和插入是类似 但是插入是选择一个就插入,选择是选择一个最小的插入
     * @param array
     */
    public static void selectSort(int[] array) {
        for (int i = 0; i < array.length-1; i++) {
            int minIndex = i;
            for (int j = i+1; j <array.length ; j++) {
                if (array[j]<array[minIndex]){
                    minIndex = j;
                }
            }
            int temp = array[i];
            array[i] = array[minIndex];
            array[minIndex] = temp;
        }
    }

    public static void main(String[] args) {
        int[] array = {4, 5, 6, 3, 2, 1};

        //bubbleSort(array);
        //insertSort(array);
        //selectSort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + "\t");
        }

    }

}