三九宝宝网宝宝百科宝宝知识

算法回顾之插入排序

12月02日 编辑 39baobao.com

[Word2013中如何插入域]2点击插入功能3点击其中的文档部件4在下拉框中选择域5比如我们插入时间,在类别中选择时间和日期6在域属性中选择其中一种形式,点击确定7如下图所示我们就插入了时间常用...+阅读

使用范围:小规模数据的排序的方案,而且是一种稳定的排序。

算法复杂度:O(n2)

思想:

首先我们来想一个问题,我们是否能找到一种方法,使一个数插入到一个有序的数组当中,并保证它依然有序呢?

那么,我们又如何将一组无序的数插入到一个有序的数组之中,并且保证它依然有序呢?

至此,聪明的读者就会发现,解决了这两个问题,我们就知道如何排序了。

下面我们来详细的讲解一下查入排序的思想:

首先我们将一组无序的数分为两组,一组有序的,记作A,一组无序的,记作B。开始的时候A中只有一个元素,显然只有一个元素的数组是有序的,我们开始将B中的元素逐个插入到A中,并且每一次插入都保证A是有序的,一直将B中的元素全部插入到A中,那么我们就将这个数组排好序了。

下面我们来看一下如何将一个数插入到一个有序数组中,有一个数组{3,5,7,9,12}和一个数6,我们可以从数组的前面开始查找直到找到一个不小于6的数,然后把6放在他前面。我们也可以从数组的后面开始查找直到找到一个不大于6的数,然后把6放到他的后面。或者我们可以用二分查找到6应该在数组中的位置然后把6放在那。在这个查找位置的过程中,基于比较的复杂度依次是O(n)、O(n)、O(log2n)。

那么,将一个数组排序的过程,就是将有序数组不断增大的过程,从开始只有一个元素,到后来整个数组都是有序的,那么,每插入一次的时间复杂度与有序数组的大小有关,假设目前的有序数组大小为i,此次插入的最坏比较次数为i,那么,最坏情况下,也就是数组倒序时,总体的比较次数为1+2+3+…+(n-1)=n(n-1)/2

情况下,也就是数组有序时,这时的比较次数为n-1次。

平均情况下,一次插入的比较次数为i/2,总体的比较次数为1/2+2/2+3/2+…+(n-1)/2=n(n-1)/4

所以,平均情况下比较复杂度为O(n2),如果我们考虑每次插入,在查找位置时使用二分查找,平均情况下比较复杂度为O(nlog2n)。

细心的读者会发现,插入排序的时间复杂度不是O(n2)吗?怎么变成O(nlog2n)了?其实,在排序的过程中,除了比较的花销之外,还有元素移动的花销。

如果用数组来实现,每次移动的花销是O(n),总体的花销是O(n2)。

如果用链表来实现,每次移动的花销是O(1),但查找时就不能用二分法,所以总体的花销还是O(n2)。

下面给出一个用数组为数据结构的插入排序的C++代码:

/**

* 插入排序方法

* #param array 数组名

* #param left 排序的起始位置

* #param length 数组要排序的长度

* #author oracleot i< left + length ; ++ i ) {

现在的任务是把array[i]插入到array[left,i)中。

int current = array[i] ;

int j ;

如果current不小于array[j]则把current查入到j+1位置。()

for( j = i-1; (j >= left) -- j ) {

array[j+1] = array[j] ;

}

array[j+1] = current ;

}

}

以下为关联文档:

Excle表格中如何插入打勾号2如下图所示,是Wps表格的操作页面:3点击左上角的插入:4找到右边的符号;5点击符号下面的三角形,找到打勾号:6点击打勾号,如图所示是已经插入打勾号的效果:处理工作表快捷键Shi...

在excle表格中如何插入时间2这里先介绍最简单的一种就是手动的输入时间3还有一种就是通过设置单元格格式,在我们选中我们要输入时间的单元格4右击选择设置单元格格式会跳出一个窗口如图5在这里我们...

excle表格如何插入表格2在excle表格的菜单栏有个插入,点击插入。(如下图)3在插入的菜单栏里找到对象,并点击它。(如下图)4点击对象会弹跳出对象页面,一个是新建,点击另一个由文件创建。(如下图)5点...

生成的课堂,灵活的学法——《插入表格》教学案例新毛小学 王惠强,表格是日常生活中随处可见,学生对此并不陌生。因此本课从观察生活中的表格入手,指导学生了解表格的基本组成,学会制作简单的表格,并在此基础上拓展,学会制作生活...

在excle如何插入图片2找到顶部菜单中的插入按钮,点击插入。3在插入菜单下选择图片按钮。4这个时候可以在本地选择想要插入的图片。5点击确定按钮,就顺利的插入图片了。6这个时候就可以看到表...

插入文字和删除文字》教学反思本节课在上课的的一开始,我展示了一篇有错误的《让我们荡起双桨》的文档,之所以选择这篇文档,主要原因是:在之前几节Word文字输入的课程中就是使用的这篇文章,同时,《让我们荡起双...

二维类间方差阈值分割的快速迭代算法【摘要】 传统的二维Otsu阈值分割算法采用穷举搜索法搜寻阈值向量。与此不同,本文提出了一种二维类间方差阈值分割的快速迭代算法,用迭代的思想解决原始二维Otsu方法计算复杂...

FDK算法中一种新的插值方法【摘要】 针对在FDK算法的反投影过程中,各个体素在探测器上投影分布的特点,本文提出一种新的插值方法。该方法根据体素投影的特点,采用在重建过程中,根据其在不同扫描角度下在各...

算理、算法比翼齐飞、有效融合—评《两、三位数除以一武进区奔牛实验小学 卢晶晶, 一、竖式计算教学与算理有效融合。算理与算法既有联系,又有区别,算理主要回答 为什么这样算 的问题,算法主要是解决 怎么算的问题 两者在计算教学...

推荐阅读
图文推荐