其他分享
首页 > 其他分享> > 插入排序

插入排序

作者:互联网

package class01;

/**
 * 插入排序:
 * 0位置到0位置上有序,然后0位置到1位置上有序,0位置到2位置上有序...0位置到n-1位置上有序
 * (可以定义一个end为每一组的第二个位置,即0,1,2,...,n-1)
 * 只需要将新来的数的索引(newNumIndex),所对应的数,
 * 和它的前一个位置(newNumIndex-1)所在的数,比较并交换。只要同时满足下边while中的两个条件,就一直交换,并newNumIndex--(类似一个指针)。
 * 周而复始,完成排序。
 */
public class Code04_InsertionSort {
    public static void main(String[] args) {
        int[] arr = {8, 7, 6, 5, 4, 2, 1};
        printArr(arr);
//        insertSort1(arr);
        insertSort2(arr);
        printArr(arr);
    }

    public static void insertSort1(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        int N = arr.length;
        for (int end = 1; end < N; end++) {
            int newNumIndex = end;//新来的数的索引为newNumIndex
            //新来的的数的前一个位置没有越界 && 新来的数的前一个数大于这个新来的数
            while (newNumIndex - 1 >= 0 && arr[newNumIndex - 1] > arr[newNumIndex]) {
                swap(arr, newNumIndex - 1, newNumIndex);//就交换
                //并将指针左移一位。指针(即新来的值的索引),一直指着这个新来的数,每次交换后,它就--。
                //直到这个新来的数,来到它该停住的位置,也就是它左边没数了,或者它左边的数不大于它了,就停止。跳出循环。
                //然后end++,即又来了一个新数,周而复始。
                newNumIndex--;
            }
        }
    }

    private static void insertSort2(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        int N = arr.length;
        //0到0范围上,就一个数,已经有序了。
        //所以end=1,即看0到1范围上,是否有序;0到2范围上是否有序;0到3范围上是否有序...周而复始。
        for (int end = 1; end < N; end++) {
            /*新数一开始,在end位置。*/
            //定义pre为新来的数的前一个数的索引,
            //如果pre没有越界 && 并且新来的的数的前一个数大于这个新来的数,就交换,并pre--。周而复始。
            for (int pre = end - 1; pre >= 0 && arr[pre] > arr[pre + 1]; pre--) {
                swap(arr, pre, pre + 1);
            }
            //这个for循环也可以得出正确结果,而且和insertSort1(...)更接近。
//            for (int newNumIndex = end; newNumIndex - 1 >= 0 && arr[newNumIndex - 1] > arr[newNumIndex]; newNumIndex--) {
//                swap(arr, newNumIndex - 1, newNumIndex);
//            }
        }
    }

    public static void swap(int[] arr, int i, int j) {
        int t = arr[j];
        arr[j] = arr[i];
        arr[i] = t;
    }

    public static void printArr(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

 

标签:pre,arr,end,newNumIndex,int,插入排序,新来
来源: https://www.cnblogs.com/TheFloorIsNotTooHot/p/16354084.html