简单排序算法之插入排序和折半插入

插入排序

算法思想:就是从第二个数开始位置记为i,值记为temp,与前面的数进行比较,找到比temp大的那个数的位置记为j。然后从j到i这些数集体后移一位,为temp留出插入的位置,依次类推。虽然时间效率不高但是空间效率高。

从小到大排序;

public class InsertSort {

    private static void insertSort(int[] arr) {

        int length = arr.length;
        for (int i = 1; i < length; i++) {
            //整体后移时, 保证arr[i] 的值不会丢失
            int temp = arr[i];
            //i索引处的值以及比前面所有值都大,表明已经有序, 无需插入
            //(i-1)索引之前的数据已经是有序的,i-1索引处的元素的值就是最大值
            if (arr[i] > arr[i - 1]) {
                int j = i - 1;
                //整体后移一格
                for (; j >= 0 && arr[j] < temp; j--) {
                    arr[j + 1] = arr[j];
                }
                //    j+1 的原因: 是因为上面循环写的j--, 所以是j+1
                //     最后将temp的值插入合适的位置
                arr[j + 1] = temp;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
    public static void main(String[] args) {
    int[] arr = new int[]{4, 2, 9, 7, 5, 73};
    insertSort_test2(arr);
}
}

第一次从2开始[2 ,4 ,9 ,7 ,5 ,73]
[2,4,7,9,5,73]
数组为 [2,4,7,7,9,73] 当i= 4;temp = 5;j = 2的位置是temp插入的位置;
[2,4,5,7,9,73]


折半插入

在插入排序的基础上对已经有序的序列中利用二分查找的思想进行插入。
从中间值mid开始查看,i 位置上的数位置在mid的左边还是右边,如果位于左边,查找位置的效率将会提高。
上代码

public class BinartInsertSort {
    private static void binaryInsertSort(int[] arr) {
        int length = arr.length;

        for (int i = 1; i < length; i++) {

            //当整体后移时,保证arr[i] 的值不会丢失
            int temp = arr[i];
            int low = 0;
            int high = i - 1;
            while (low <= high) {

                //找到low, high 中间索引
                int mid = (low + high) / 2;
                if (temp < arr[mid]) {
                    //限制在索引大于mid 的那一半中搜索
                    low = mid + 1;
                } else {
                    //限制在索引小于mid 的那一半中搜索
                    high = mid - 1;
                }
            }
            //将low 到i处的所有元素向后整体移动一位
            for (int j = i; j > low; j--) {
                arr[j] = arr[j - 1];

            }
            arr[low] = temp;
        }
        System.out.println(Arrays.toString(arr));
    }

    public static void main(String[] args) {
        int[] arr = new int[]{6, 3, 1, 10, 9, 2};
        binaryInsertSort2(arr);
    }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值