彻底搞懂插入排序

插入排序

插入排序可以分为两种:一是直接插入排序,二是希尔排序。接下来主要说的直接插入排序

算法思想

它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

算法实现

直接插入排序是将无序序列中的数据插入到有序的序列中,在遍历无序序列时,首先拿无序序列中的首元素去与有序序列中的每一个元素比较并插入到合适的位置,一直到无序序列中的所有元素插完为止。对于一个无序序列arr{7,6,9,3,1,5,2,4}来说,我们首先先确定首元素7是有序的,然后在无序序列中向右遍历,6小于7则它插入到7的前面,再继续遍历到9,9大于7则插入到7的后面,这样继续直到得到有序序列{1,2,3,4,5.,6,7,9}。

过程图示

我们就上述的实例来进行演示。

第一轮,当前有序的序列是7,我们找到无序序列中的首元素6,与7进行比较。小于7,所以放在7的前面

image-20210608085620350

第二轮,当前有序的序列是6,7,我们找到无序序列中的首元素9,与7进行比较。大于7,所以放在7的后面

image-20210608085921885

第三轮,当前有序的序列是6,7,9,我们找到无序序列中的首元素3,与9进行比较。小于9,在与7进行比较。小于7,与6进行比较。小于6,所以放在6的前面

image-20210608090246406

第四轮,当前有序的序列是3,6,7,9,我们找到无序序列中的首元素1,与9进行比较。小于9,在与7进行比较。小于7,与6进行比较。小于6,与3进行比较。小于3,所以放在3的前面,

image-20210608090744119

第五轮,当前有序的序列是1,3,6,7,9,我们找到无序序列中的首元素5,与9进行比较。小于9,在与7进行比较。小于7,与6进行比较。小于6,所以放在6的前面

image-20210608091031367

好了,接下来的就不再去进行排序了。

https://www.processon.com/view/link/60bec41ff346fb29e3ed582b可以访问这个网站就可以看到完整的图片实例了。

代码演示

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = {101,34,119,1,-1,89};

        int len = arr.length;

        for(int i = 1;i < len;i++)
        {
            //  temp 用来保存当前要进行排序的元素
            int temp = arr[i];

            int j;
            //j = i-1: temp的前一个元素,
            //j >= 0: 避免数组越界
            for(j = i-1;j >= 0 && temp < arr[j];j--)
            {
                //将大的元素后移,与temp交换位置
                arr[j+1] = arr[j];
            }
            //将进行排序的元素插入到有序序列中(此时经历的一次j--,j = -1)
            arr[j+1] = temp;
        }
        System.out.println(Arrays.toString(arr));
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值