前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图解插入排序

图解插入排序

作者头像
CoderJed
发布2018-09-30 10:21:02
1.4K0
发布2018-09-30 10:21:02
举报
文章被收录于专栏:Jed的技术阶梯Jed的技术阶梯

1. 图示过程

插入排序图示

2. 文字叙述过程

  • 第1趟插入:将第2个元素插入前面的有序子序列,此时前面只有一个元素,当然是有序的
  • 第2趟比较:将第3个元素插入前面的有序子序列,前面的2个元素是有序的
  • ......
  • 第n-1趟比较:将第n个元素插入前面的有序子序列,前面n-1个元素是有序的

3. Java代码实现

代码语言:javascript
复制
public static void insertionSort(int[] nums) {
    int temp;
    for(int i = 1; i < nums.length; i++) {
        for(int j = i - 1; j >= 0 && nums[j] > nums[j + 1]; j--) {
            temp = nums[j];
            nums[j] = nums[j + 1];
            nums[j + 1] = temp;
        }
    }
}

4. 复杂度

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1),只需要一个附加程序单元用于交换
  • 稳定性:插入排序是稳定的排序算法

5. 优化

上面的算法的缺点:在第i-1趟插入时,需要把第i个元素插入到前面的i-1个元素中,该算法总是从i-1个元素开始逐个比较之前的每个元素,直到找到第i个元素的插入位置,这显然没有利用前面0~i-1个元素已经有序的特点

优化:在0~i-1个有序元素给第i个元素寻找插入的位置时,使用二分查找法可以有效提高查找插入位置的时间效率,经过优化的插入排序称为折半插入排序

代码语言:javascript
复制
public static void binaryInsertionSort(int[] nums) {
    for(int i = 1; i < nums.length; i++) {
        int left = 0;
        int right = i - 1;
        int temp = nums[i];
        // 通过二分查找找到插入的位置
        while(left <= right) {
            int mid = (left + right) / 2;
            if(temp > nums[mid]) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        // 插入位置之后的元素依次向后移动
        for(int j = i; j > left; j--) {
            nums[j] = nums[j - 1];
        }
        // 更新插入位置的值
        nums[left] = temp;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 图示过程
  • 2. 文字叙述过程
  • 3. Java代码实现
  • 4. 复杂度
  • 5. 优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档