十大经典排序算法-插入排序

插入排序
实现原理

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

给定无序数组如下:
在这里插入图片描述
把数组的首元素5作为有序区,此时有序区只有这一个元素:
在这里插入图片描述
第一轮
让元素8和有序区的元素依次比较。
8>5,所以元素8和元素5无需交换。

此时有序区的元素增加到两个:
在这里插入图片描述
第二轮
让元素6和有序区的元素依次比较。
6<8,所以把元素6和元素8进行交换:
在这里插入图片描述
6>5,所以把元素6和元素5无需交换。

此时有序区的元素增加到三个:
在这里插入图片描述
第三轮
让元素3和有序区的元素依次比较。
3<8,所以把元素3和元素8进行交换:
在这里插入图片描述
3<6,所以把元素3和元素6进行交换:
在这里插入图片描述
3<5,所以把元素3和元素5进行交换:
在这里插入图片描述
此时有序区的元素增加到四个:
在这里插入图片描述
以此类推,插入排序一共会进行(数组长度-1)轮,每一轮的结果如下:
在这里插入图片描述
刚才演示的插入排序过程,有一点可以优化,当我们把一个新元素插入到有序区的时候,并不需要老老实实进行元素的两两交换。

让我们以第三轮举例:
在这里插入图片描述
在第三轮操作中,我们需要让元素3逐个与有序区的元素进行比较和交换,与8交换、与6交换、与5交换,最终交换到有序区的第一个位置。

但是我们并不需要真的进行完整交换,只需把元素3暂存起来,再把有序区的元素从左向右逐一复制。

第一步,暂存元素3:
在这里插入图片描述
第二步,和前一个元素比较,由于3<8,复制元素8到它下一个位置:
在这里插入图片描述
第三步,和前一个元素比较,由于3<6,复制元素6到它下一个位置:
在这里插入图片描述
第四步,和前一个元素比较,由于3<5,复制元素5到它下一个位置:
在这里插入图片描述
第五步,也是最后一步,把暂存的元素3赋值到数组的首位:
在这里插入图片描述
显然,这样的优化方法减少了许多无谓的交换。

实现步骤

1:将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2:从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面)。

public class test {
    public static void insertSort(int[] arr){
        //从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
        for(int i=1;i<arr.length;i++){
            //设置一个暂存元素,让有序区的元素从左到右逐一复制
            int tmp = arr[i];
            int j = i;
            //从右向左比较元素的同是,进行元素复制
            while (j > 0 && tmp < arr[j-1]) {
                //将arr[j-1]的值赋值给arr[j]
                arr[j] = arr[j-1];
                j--;
            }
            if(j != i){
                //将tmp值插入适当位置
                arr[j] = tmp;
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = new int[]{9,7,2,8,10,30,99,-2};
        insertSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值