排序---插入排序

插入排序

  • 插入排序原理

  • Java代码

  • 总结

插入排序原理

图1图2
如图1:
插入排序的原理相当简单,就好像摸一副牌,每次都要将摸到的一张牌,插入到已经排序好的牌中,比如下一次摸到10
1.首先将10与A比较,A比10大,所以A向后移动一个位置
2.这时就可以把10插入到原来A的位置吗?答案是:不能
3.此时还需要比较K与10的大小,Q与10的大小
4.直到J,发现J还是比10大,所以J向后移动一个位置
5.此时后面已经没有可以比较的牌了,所以将10放置在J后即可,如图2所示

Java代码

package cn.com.mp.sort;

public class InsertionSort {

    public static void main(String[] args) {
        //int[] array = { 2, 3, 5, 6, 7, 9, 45, 56, 90 };
        int[]  array={56,2,8,5,9,46,53,7,1};
        sort(array);
    }

    /*
     * 定义插入排序算法,以从小到大的顺序排序
     * */
    public static void sort(int[] array){
        int len=array.length;
        /*
         * 假设此数组为一副牌
         * 1.默认第一张牌我们已经拿在手里,所以i=1开始
         * 2.依次将所有的牌拿到手里
         * */
        int temp,j;
        for(int i=1;i<len;i++){
            temp=array[i];//将刚刚拿到手里的牌,放在临时变量中
            /*
             * 1.从最后的位置开始循环遍历,已经拿在手里的i-1张牌,所以j=i-1开始
             * 2.循环结束的条件,j>=0 && array[j]>temp,即遍历完所有手里的牌或者temp>=手里的某张牌
             * 3.因为判断条件是严格>,=的时候并不移动位置,所以保证了稳定性
             * */
            for(j=i-1;j>=0 && array[j]>temp;j--){
                /*
                 * 若循环没有结束即手里还有牌,并且当前位置的牌比temp大
                 * 则将这张牌后移一个位置,腾出空位
                 * */
                array[j+1]=array[j];
            }
            /*
             * 判断循环跳出,则为空位赋值,将temp放在空位上
             * 因为循环结束时,j--,所以空位应该在j+1的位置上
             * */
            array[j+1]=temp;
        }

        /*所有的牌拿到手后,代表插入排序已经完成,即可遍历输出*/
        for(int i=0;i<len;i++){
            System.out.print(array[i]+" ");
        }
    }
}

运行结果:
结果

总结:

1.时间复杂度:
最好情况,每一次摸到的牌都比手中排序好的最后一张牌大,所以不需要移动位置,只需将n张牌拿手即可,所以时间复杂度为O(n)
最坏情况,每一次摸到的牌都比手中已排序好的任何一张牌小,所以需要移动手中所有的牌的位置,所以时间复杂度为O(n^2)
2.稳定性
因为定一个严格的判断,只有当array[j]>temp时才将j位置的牌后移一个位置,等于时并不移动,所以插入排序是稳定性排序
3.建议
建议建立断点,使用Junit跟踪调试当数组已经是排序好的情况,可更加清楚的判断时间复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值