JAVA代码[No.2]——插入排序详解

Posted 拓扑TOP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA代码[No.2]——插入排序详解相关的知识,希望对你有一定的参考价值。


Text/王 迪

Editor/唐莉媛



01

插入排序之直接插入法



1、插入排序的基本思想

每一趟将一个待排序的记录,按照其关键字值得大小插入到已排序的部分文件中的适当位置上,直到全部插入完成。


2、插入排序的主要方法

直接插入排序、希尔排序、折半插入排序。


3、直接插入排序的基本思想

每次将一个新数据插入到有序队列中的合适位置里

假设有一组无序序列 R0, R1, … , RN-1。

① 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列。

② 然后我们要依次把 R1, R2, … , RN-1 插入到这个有序序列中。所以,我们需要一个外部循环,从下标 1 扫描到 N-1 。

③ 接下来描述插入过程。假设这是要将 Ri 插入到前面有序的序列中。由前面所述,我们可知,插入Ri时,前 i-1 个数肯定已经是有序了。

所以我们需要将Ri 和R0 ~ Ri-1 进行比较,确定要插入的合适位置。这就需要一个内部循环,我们一般是从后往前比较,即从下标 i-1 开始向 0 进行扫描。


核心代码:

JAVA代码[No.2]——插入排序详解

运行结果:

JAVA代码[No.2]——插入排序详解


4、直接插入排序算法的性能

① 时间复杂度

a、 当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)。

b、 当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N2)。

c、 所以,数据越接近正序,直接插入排序的算法性能越好。

② 空间复杂度

由直接插入排序算法可知,我们在排序过程中,需要一个临时变量存储即将要插入的值,所以空间复杂度为 1 。

③ 算法稳定性

直接插入排序的过程中,不需要改变相等数值元素的位置,所以它是稳定的算法。


--------------------------



02


插入排序之希尔排序法


1、希尔排序的基本思想

希尔排序(shell sort)这个排序方法又称为缩小增量排序,是1959年D·L·Shell提出来的。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的。


2、希尔排序示例图

我们来看下希尔排序的图解步骤,在此我们选择增量gap = length / 2,缩小增量继续以gap = gap / 2的方式,这种增量选择我们可以用一个序列来表示,{n/2, (n/2)/2, …1},称为增量序列。

JAVA代码[No.2]——插入排序详解


3、希尔排序的核心代码

JAVA代码[No.2]——插入排序详解

JAVA代码[No.2]——插入排序详解

测试结果:

JAVA代码[No.2]——插入排序详解


4、希尔排序算法的性能

①时间复杂度

对希尔排序的时间复杂度分析很困难,在特定情况下可以准确的估算排序码的比较次数和元素移动的

次数,但要想弄清楚排序码比较次数和元素移动次数与增量选择之间的依赖关系,并给出完整的数学分析,还没有人能够做到,有几种接近的答案:O(nlog2为底n)或O(n^1.25)。

②空间复杂度

由希尔排序算法可知,我们在排序过程中,需要一个增量元素,所以空间复杂度为 1 。

③算法稳定性

希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小, 插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比O(n^2)好一些。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。


--------------------------





本期关于插入排序的内容就暂时介绍到这里,往期文章戳下面链接哦!



JAVA代码[No.2]——插入排序详解

java分享往期精彩









JAVA代码[No.2]——插入排序详解


    


ICT知识、Java知识、读书推荐、项目分享带给大家

敬请期待



以上是关于JAVA代码[No.2]——插入排序详解的主要内容,如果未能解决你的问题,请参考以下文章

插入排序详解

插入排序算法详解及代码实现

插入排序-Java实现

希尔排序ShellSort算法详解Java/Go/Python/JS/C不同语言实现

C# 插入排序详解

排序算法之直接插入排序