排序方法之三:插入排序
Posted 大师兄编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序方法之三:插入排序相关的知识,希望对你有一定的参考价值。
THERE
排序方法之插入排序
把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,每次将无序表中的元素,插入到前面已经排好序的有序序列中去,直到排序完成。
1
算法过程->直接插入排序
原始序列:{ 5 、2 、6 、0 、9 } 设5为有序,其中i为1
第一趟排序:第i个元素2比5小,则插入到5前面,然后i自增
得到结果{ 2 、5 、6 、0 、9 }
第二趟排序:第i个元素6比5大,则插入到5后面,然后i自增
得到结果:{ 2 、 5 、6 、0 、 9 }
第三趟排序:第i个元素0比2,5,6小,则插入到2前面,然后i自增
得到结果:{ 0 、 2 、 5 、6 、 9 }
第四趟排序:第i个元素9比6大,则插入到6后面,然后i自增
得到结果:{ 0 、 2 、 5 、 6 、 9 }
最终的排序结果为:{ 0 、 2 、 5 、6 、9 }
2
流程图展示->直接插入排序
3
代码实现->直接插入排序
JAVA实现代码
4
算法分析->直接插入排序
1、时间复杂度
1.1、在最好情况下,严格递增的数组,比较次数C和移动次数M为C=n-1,M = 0,时间复杂度为O(n)。
1.2、在最坏情况下,严格递减的数组,比较次数C和移动次数M为:C = n(n-1)/2,M = n(n-1)/2,时间复杂度为O(n2)。
1.3、综上,时间复杂度为:O(n2) 。
2、优缺点
2.1、优点:稳定,相对于冒泡排序与选择排序更快。
2.2、缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量大的时候;
5
算法优化->折半插入排序
原理:折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法。
区别:在插入到已排序的数据时采用来折半查找(二分查找),取已经排好序的数组的中间元素,与插入的数据进行比较,如果比插入的数据大,那么插入的数据肯定属于前半部分,否则属于后半部分,依次不断缩小范围,确定要插入的位置。
6
算法过程->折半插入排序
原始序列:{ 5 、2 、6 、0 、9 } 设5为有序,其中i为1
第一趟排序:low为0,high为0,则中间值下标为0((low+high)/2,下文都是这样计算)即5大于2,则插入到5前面,然后i自增。
得到结果{ 2 、5 、6 、0 、9 }
第二趟排序:low为0,high为1,则中间值下标为0,即2小于6,然后low等于中间值的下标加1,继续找中间值为5小于6,则插入到5后面,然后i自增。
得到结果:{ 2 、 5 、6 、0 、 9 }
第三趟排序:low为0,high为2,则中间值下标为1,即0小于5,然后high等于中间值的下标减1,继续找中间值为2大于0,则插入到2前面,然后i自增。
得到结果:{ 0 、 2 、 5 、6 、 9 }
第四趟排序:low为0,high为3,则中间值下标为1,即2小于9,然后low等于中间值的下标加上1,继续找中间值为5小于9,然后low等于中间值的下标加上1,继续找中间值为6小于9,则插入到6后面,然后i自增。
得到结果:{ 0 、 2 、 5 、 6 、 9 }
最终的排序结果为:{ 0 、 2 、 5 、6 、9 }
7
流程图展示->折半插入排序
8
代码实现->折半插入排序
JAVA实现代码
9
算法分析->折半插入排序
1、时间复杂度
折半插入排序减少了比较元素的次数,约为O(nlogn),比较的次数取决于表的元素个数n。因此,折半插入排序的时间复杂度仍然为O(n²),但它的效果还是比直接插入排序要好。
2、空间复杂度
排序只需要一个位置来暂存元素,因此空间复杂度为O(1)。
3、优缺点
3.1、优点 : 稳定,相对于直接插入排序元素减少了比较次数
3.2、缺点 : 相对于直接插入排序元素的移动次数不变;
插入排序是一个稳定的排序算法哦
插入排序包括:
直接插入排序、折半插入排序
希尔排序、链表插入排序
本文只是介绍了直接插入排序和折半插入排序
喜欢本篇内容请给我们点个在看
以上是关于排序方法之三:插入排序的主要内容,如果未能解决你的问题,请参考以下文章