排序(四):插入排序

排序算法系列文章

排序(一):冒泡排序
排序(二):选择排序
排序(三):堆排序
排序(四):插入排序
排序(五):二分搜索
排序(六):归并排序
排序(七):快速排序
排序(八):希尔排序

插入排序(Insertion Sort)

基本思想

把n个待排序的元素看成为一个有序数组和一个无序数组。开始时有序数组中只包含一个元素,无序数组中包含有n-1个元素,排序过程中每次从无序数组中取出第一个元素,把它依次与有序数组的元素进行比较,将它插入到有序数组中的适当位置,使之成为新的有序数组,直到最后无序数组没有元素为止。

算法步骤

①在执行过程中,插入排序会将序列分为2部分

  • 头部是已经排好序的,尾部是待排序的

②从头开始扫描每一个元素

  • 每当扫描到一个元素,就将它插入到头部合适的位置,使得头部数据依然保持有序

复杂度

  • 插入排序的平均时间复杂度是 O(n^2),空间复杂度为 O(1)
  • 最好时间复杂度为O(n),最坏时间复杂度为 O(n^2)
  • 插入排序算法是稳定的

代码实现

public class InsersionSort {
    public static void main(String[] args) {
        int[] array = {10,9,19,28,37,34,5};
        InsertionSort1(array);
        for (int i : array){
            System.out.println(i + " ");
        }
    }

    public static void InsertionSort1(int[] array){
        //从 1 开始,将 0 位置的元素当作已经有序的元素
        for (int begin = 1; begin < array.length; begin++) {
            //选择插入排序的数,保存为num
            int num = array[begin];
            //计算 num 前一个数的索引
            int preIndex = begin - 1;

            for(;preIndex >= 0; preIndex--){
                //进行检查,如果num小于前面的数,则将前一个数往后移
                //若比前一个数大,则结束此次循环
                if (num < array[preIndex]){
                    array[preIndex + 1] = array[preIndex];//前面的数往后移动一位
                }else{
                    break;
                }
            }
            //结束时的位置保存num
            if (num != array[begin]){//说明移动了位置,需要插入
                array[preIndex + 1] = num;//将作为比较的数插入数组中,形成新的片段有序数组
            }
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值