java 实现二分插入排序

我们都知道二分插入排序,是jdk中Arrays.sort()在length小于48时候的默认排序方法,也可得知,这种排序十分重要,且比直接插入排序的性能更加提高了。

这次就来说一下java的二分插入排序算法。

首先说一下二分插入排序的思想:将数组从下标为1的元素开始遍历,并且我们的目的是让这个元素左边为排序之后的状态,右边为待排序的状态,然后每遍历一位就把一位扔到左边。然后都遍历完了,就排序结束了。和直接插入排序的区别在于:在扔到左边之后,多了一个二分的过程,换句话说,插之前,比一下左边序列的中间坐标的值,比它大就从中间往左边遍历插入,比它小就从中间往右边遍历。

(本来也是做个人笔记,博客园有动态图的排序过程,可以自己搜索一下)

然后附上我实现的代码:

public class binaryInsert_Sort {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        System.out.println("输入序列,输入0停止");
        int i = -1;
        Scanner in = new Scanner(System.in);
        for (; i != 0; ) {
            i = in.nextInt();
            if (i != 0) {
                list.add(i);
            }
        }

        int[] arr = list.stream().mapToInt(Integer::intValue).toArray();

//        int[] arr = {1, 7, 5, 4, 7};

        int[] sort = Sort(arr);

        for (int l : sort) {
            System.out.println(l);
        }

    }

    public static int []Sort(int [] arr) {

        if (arr.length == 1) {
            return arr;
        }

        for (int i = 1; i < arr.length; i++) {
            int key = getKey(arr, i);//获取到插入的下标
            int k = arr[i];
            for (int j = i - 1; j >= key; j--) {
                arr[j + 1] = arr[j];
            }

            arr[key] = k;

        }

        return arr;



    }

    /**
     * 返回插入原数组的下标
     */
    public static int getKey(int[] arr, int i) {

        //每次排序的最左面的坐标
        int left = 0;
        //每次排序的最右面的坐标
        int right = i-1;
        //中点
        int mid = 0;

        while (left <= right) {
            mid = (left + right) / 2;
            if (arr[i] >= arr[mid]) {//要插入的元素在左边区间的右边
                left = mid + 1;
            } else {//要插入的元素在左边区间的左边
                right = mid - 1;
            }
        }
        return left;

    }




}

你可能感兴趣的:(数据结构与算法)