插入排序-java

    /**
     * 插入排序
     * 思路:从下标1开始跟前面的数据进行从小到大排序,保证当前下标前面的数据,都是已经排好序的。
     * 这样的话,下标后面的,需要排序的数据,只需要向前对比,并找到自己合适的位置;
     * 向前查找过程中,若遇到比自己小的数j,则j以及j之前的数据就不需要进行对比了,肯定比自己小,
     * 这样就省去了跟剩余数对比的逻辑,提高算法效率。
     * 复杂度:若数组是一个从小到大已经排好序的数组,则只需要对比n此,复杂度为n
     * 若数组数一个从大到小排好序的数组,则每个元素,都需要跟前面的每个进行排序,复杂度为n*log以2为底n
     */
    @Test
    public void insertionSortTest() {
        int[] array = getIntArray();
        int len = array.length;

        // 0自身就一个数,必然已经排好序,所以这里从1开始,跟前面的排好序的数组进行对比;
        int start = 1;
        while (start < len) {
            /**
             * 定义一个临时变量,用于记录对比的下标位置,因为start跟i对比后,可能还需要跟i-1,i-2位置对比
             */
            int i = start - 1;
            while (i >= 0 && array[start] < array[i]) {
                i--;
            }
            // i++就是start应该处于的合适的位置.
            i++;

            /**
             * while退出的条件:start是较小的一个数,可以在前面的列表中找到自己的位置;
             *               或者 start就是最大数(i == start),while方法体没执行,就退出了。             *
             */
            if (i < start) {
                // 将start到i之间的数据都往前提一位,然后将start赋值到i的位置。
                int temp = array[start];
                for (int j = start; j > i; j--) {
                    array[j] = array[j - 1];
                }
                array[i] = temp;
            }
            // 开始确认下一个数的位置.
            start++;
        }
        printArray(array);
    }
    private int[] getIntArray() {
        int[] array = new int[10];
        for (int i = 0; i < 10; i++) {
            array[i] = (int) (Math.random() * 100);
            printMsg("value" + i + ":" + array[i]);
        }
        return array;
    }

    private void printArray(int[] array) {
        int len = array.length;
        printMsg("print array start--");
        for (int i = 0; i < len; i++) {
            printMsg(array[i] + "");
        }
        printMsg("print array end--");
    }

    private void printMsg(String msg) {
        System.out.println(msg);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值