插入排序学习总结

目录

1、算法描述

2、算法演示

3、 算法实现

4、总结

4.1 描述(已升序为例)

4.2 优化方式


今天介绍的是插入排序,那插入排序跟选择排序是有点比较像的,它们都是将一个数据划分为两个部分,一个是已排序,一个是未排序,那这个是它们的相同点,当然实现上还是有很大的不一样哈,接下来我们就进入今天插入排序学习吧。

选择排序的文章:https://blog.csdn.net/weixin_53041251/article/details/123054092

1、算法描述

  1. 将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序) 。
  2. 重复以上步骤,直到整个数组有序 。

2、算法演示

这里有一个无序数组。

插入排序。它首先会把索引 0 (9) 的这个位置,视为已排序的部分,那从索引 1 (3)开始的部分就都是未排序的部分,那我们的思路就是,不断扩大有序的区域,缩短无序的区域。

刚开始我们的有序区只有一个元素,那我们就把有序区扩充两个元素,这个时候它就会将 3 这个元素所在位置给它空出来,空出来的目的,就是看看把 3 放在哪个合适的位置,能够保证前面的这些元素仍然有序。

那显然,把 9 往后移动一下 ,然后将3 放在9 的位置上,这样就能保证, 索引 0 和 索引 1 区域的元素顺序是一致的,这样第一轮插入排序就完成了,接下来我们再演示一个。

接下来,我们有序的区域又扩大了,那7的位置是不是就要空出来,然后将 7 和前面的元素进行比较,看看 7 能放到什么位置,保证 索引 0 和 索引 1 和 索引 3 的元素有序。

很显然,9往后移动,那 3 就不用 移动了,因为 7 比 三 大嘛。

这样 , 索引 0 ,1 ,2 都是有序的了,接下来就是重复以上步骤直到数组有序为止。

那这样,我们的插入排序就走完了。

插入排序相对选择排序,它的优点还是不少的,

1、首先,它是一个稳定排序算法,选择排序是一个不稳定排序算法。

2、其次就是,插入排序它的性能上其实要略高于选择排序(大部分情况下)。

3、最后就是插入排序和冒泡排序的共同点,它们都是对已排序的数组,有更高效的排序效率。

比如,你看

这个数组它已经是有序的了,那把这个2 拿出来,它发现,它比1 大 ,那它岂不是就不要动,它比前面的 1 大 ,所以它两仍然是有序的,所以只比较了一次。

那接下来 3 跟 2 比,3 比 2 大 ,那也就是也比 2前面的要大,所以也放在原来的位置,这也只比较了一次。

所以根据这个规律,以此类推。

3、 算法实现

/**
 * @description: 插入排序算法实现
 * @author: jie
 * @time: 2022/6/19 14:37
 */
public class Inser {
    public static void main(String[] args) {
        // 准备一个 无序的数组
        int[] ints = {9, 1, 3, 3, 5, 4, 6, 8, 7, 2};
        // 调用排序方法
        insert(ints);
    }

    /**
     * @description: 排序方法
     * @author: jie
     * @time: 2022/6/19 14:40
     */
    static void insert(int[] ints) {
        // i 代表插入元素的一个索引
        for (int i = 1; i < ints.length; i++) {
            // 声明一个临时变量 ,用来存储我们待插入的值
            int t = ints[i];
            // 已排序区域的元素索引的值
            int j = i - 1;
            while (j >= 0) {
                // j 是上一个元素索引,如果 > t,后移
                if (t <= ints[j]) {
                    ints[j + 1] = ints[j];
                } else {
                    // // 如果 j 已经 <= t, 则 j 就是插入位置,退出循环,减少比较的次数。
                    break;
                }
                j--;
            }
            ints[j + 1] = t;
            // 打印
            System.out.println(Arrays.toString(ints));
        }
    }
}

效果:

4、总结

4.1 描述(已升序为例)

  1. 将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域。
  2. 重复以上步骤,知道数组有序。

4.2 优化方式

  1. 待插入元素进行比较时,遇到比自己小的元素,就代表找到了插入 位置,无需进行后续比较。
  2. 插入时直接移动元素,而不是交换元素。

插入排序通常被同学们所轻视,其实它的地位非常重要。小数据量排序,都会优先选择插入排序

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供一些关于内部排序算法比较课程设计的建议。 首先,您需要确定该课程设计的目标和学习内容。您可以考虑以下几个方面: 1. 内部排序算法的基本概念和分类,如插入排序、选择排序、冒泡排序、归并排序、快速排序等。 2. 掌握算法复杂度分析的方法,如时间复杂度、空间复杂度等。 3. 了解不同排序算法的优缺点,如稳定性、原地排序、递归和非递归等。 4. 实现不同排序算法的代码,并进行性能测试和比较。 5. 分析排序算法的优化方案,如基于算法改进、数据结构设计、并行化等。 接下来,您可以根据以上考虑的内容,制定课程设计的详细计划。以下是一个可能的课程设计计划: 1. 第一周:介绍内部排序算法的基本概念和分类,讲解插入排序、选择排序、冒泡排序等简单排序算法的实现和性能分析。 2. 第二周:学习归并排序和快速排序等高级排序算法的实现和性能分析,分析算法的时间复杂度和空间复杂度。 3. 第三周:实现不同排序算法的代码,并进行性能测试和比较,讨论不同算法的优缺点和适用场景。 4. 第四周:分析排序算法的优化方案,如基于算法改进、数据结构设计、并行化等,实现优化后的算法并测试性能。 5. 第五周:总结和回顾整个课程设计的过程,讨论可能的改进和未来研究方向。 希望这些建议能够对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我阿杰好了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值