数据结构与算法-插入&希尔&归并(插入排序)

为啥把插入排序,希尔排序,归并排序纳入一类排序思想

插入排序,希尔排序,归并排序这三种排序方式其实是依次优化的,希尔排序是插入排序的一种升级,归并排序是插入算法的升级,效率比希尔排序还好
时间复杂度 : 插入排序 > 希尔排序 > 归并排序
(ps :如果在学习这三个算法之前需要掌握 时间复杂度计算方式 和 递归 .链接如下
1.递归&分治&回溯
2.时间复杂度
)

插入排序

生活中有很多类似于插入排序的行为,例如打扑克.
比如我现在手上抓到一副牌 2,7,1,9,8,6,4
step1:将 7 取出来和 2比较,发现7>2,那么7的位置不变
step2:取出 1,依次和前面的7和2比较 ,则1放在 2的前面 ,变成 1,2,7,9,8,6,4
step3:取出9,仪器和前面的 7 ,2 ,1比较,因为9已经比7大了,所以就不需要再往前比较了,数组变成 1,2,7,9,8,6,4

最终得到 1,2,4,6,7,8,9

排序思想
我们把一个数组看成两部分,左边部分为已经排序好的,右边部分为等待排序的,每次从右边取出一个数据依次和左边的数据比较
在这里插入图片描述

代码

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

        sort(array);


    }

    /**
     *
     * @param array
     */
    public static void sort(int array[]){
        if (array == null || array.length <=1){
            return;
        }
        int length = array.length;
        //从下标为1的开始排序,因为第一个数据不用排,将数组分为了  0到i  ,i+1到 length
        for (int i =1;i< length;++i){
            //取出下标为i的数,要拿这个数与i之前的数比较
            int temp =array[i];
            int j = i-1;
            for (;j>=0;--j){
                if (temp < array[j]){
                    array[j+1] = array[j];
                }else {
                    //这个break特别关键,可以不用再往前遍历了
                    //最小的时间复杂度 就是 传进来的数组 也是跟排序方式(这里是从小到大),为O(n),否则为O(n~2)
                    //所以只要数组在插入排序之前做一些处理,尽量让数组为有序的,那么就可以多进入这break里面,从而优化排序算法
                    //因此诞生了 希尔排序   归并排序
                    break;
                }
            }
            //在上面的j的for循环中,j其实就是temp的最终位置的前一个,所以下面需要 j+1
            array[j+1] = temp;
            System.out.println("第 "+ i +" 次排序后的数组 :" + getArrayString(array));
        }

    }

    /**
     *
     * @param array
     * @return
     */
    public static String getArrayString(int array[]){
        String s= "";

        for (int i =0;i< array.length;++i){
            s += array[i] +" ";
        }
        return  s;
    }

输出结果:
第 1 次排序后的数组 :2 7 1 9 8 6 4
第 2 次排序后的数组 :1 2 7 9 8 6 4
第 3 次排序后的数组 :1 2 7 9 8 6 4
第 4 次排序后的数组 :1 2 7 8 9 6 4
第 5 次排序后的数组 :1 2 6 7 8 9 4
第 6 次排序后的数组 :1 2 4 6 7 8 9

时间复杂度
插入排序最好的情况就是传进来的数组是已经有序的,每次都进入 break中,这个时候时间复杂度为 O(n),最糟糕的情况是传进来的数组刚好是 逆序的 ,比如期望的是从小到大,但是传进来的是从大到小,每次都不会进入break。
优化 优化插入排序的方式就是尽量让数组期望排序,能break多次数,或者尽量少的次数让先让数组有序,因此出现了

希尔排序
归并排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值