博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
插入排序---一步步接近真相
阅读量:4170 次
发布时间:2019-05-26

本文共 848 字,大约阅读时间需要 2 分钟。

1. 思路

插入排序基于一种简单的思路:把数组分为左右两个部分,左侧为有序数组,右侧为无序数组,把右侧的无序数组,一个一个的插入到左侧的有序数组,从而步步为营的完成排序。排序过程如下:

① 第2位与第1位比较,如果比第一位小就换位置

 

② 第3位与第2位比,如果比第2就换位置,第2位再与第1位比较,如果比第1位小就换位置.

 

        …….

③ 直到最后一位

 

2. 代码相关部分

① 插入排序代码段

 

② 运行过程

 

绿色是以完成排序红色为本次排序交换部分,黑色为无操作部分

3.时间复杂度

我们不妨输入两组性质完全相反的数组来观察执行过程。

a. 正序序列[0,1,2,3,4,5,6,7,8,9]

执行过程图

 

我们可以看到,在有序系列中,只有红色对角线执行了比较操作,没有任何交换操作。由此可以得出,对于任意有序序列N比较次数为N-1.

b. 倒序序列[9,8,7,6,5,4,3,2,1,0]

执行过程如下

 

1,比较1次 交换1

2,比较两次,交换两次

     ……

9比较9,交换9

10换成任意长度N 比较次数 1+2+…+N-1= N2/2.

交换次数同样为N2/2.

由此,我们可以得出,正序序列的时间复杂度为O(N),倒序序列的时间复杂度为O(N2)。所以插入序列的时间复杂度为O(N2)

4.特性与思考

不同于,插入排序依赖输入的特性,输入序列顺序性越好,排序效率越高

有关性能优化的思考:

① 预处理。因为插入排序对有序序列有很好的性能优势,那么我们可不可以先将数组处理一下,处理成大致有序的,然后再进行插入排序呢?

② 交换次数优化。考量如下代码段

 

每一步,如果右侧的数据小于左侧的数据,就需要进行交换,这会导致很多交换实际上是无效的,实际上整个循环交换一次就够了。

③ 比较次数优化。承接2,能否在比较次数上做些优化呢?我们能够看到,插入算法的比较是线性的。因为我们要插入的左侧部分是有序的,所以可以尝试着用二分法查找来进行优化,这样线性比较就变成了指数比较。

你可能感兴趣的文章
Yocto tips (19): Yocto SDK Toolchian的使用
查看>>
Yocto i.MX6 (TQIMX6) (04) : 使用mjpg-streamer做一个WebCam Server
查看>>
Nexus 7 Cyanogenmod OS Compile and errors
查看>>
Yocto tips (20): Yocto中qemu模拟器的使用,以zynq Cortex-A9为例
查看>>
打造嵌入式ARM Linux防火墙:1. iptables基础
查看>>
4G模块SIMCOM7100 LTE在ARM Linux下使用PPPD上网
查看>>
为小米4与小米3 Mi3 Mi4编译Cyanogenmod 12.1与13.0 (CM12与CM13) 的步骤以及错误解决
查看>>
原生Android系统的第一次开机google验证的解决
查看>>
S5P4418与S5P6618的Android boot.img的解压与压缩, Sparse ext4文件系统
查看>>
【EVB-335X-II试用体验】 u-boot与kernel的编译以及本地repo的建立
查看>>
【EVB-335X-II试用体验】 上手试用与资源使用
查看>>
【EVB-335X-II试用体验】 Yocto环境的建立及Rootfs的构建与使用
查看>>
<<C++程序设计原理与实践>>粗读--chapter0 chapter1 chapter2
查看>>
<<C++程序设计原理与实践>>粗读--chapter3 chapter4 Chapter5
查看>>
<<C++程序设计原理与实践>>粗读 -- chapter8 Chapter9
查看>>
Linux Qt程序打包成一个可执行文件
查看>>
DragonBoard 410C中的Fastboot与调试串口注意事项
查看>>
跨系统的录音格式兼容性问题: iOS Android
查看>>
JVM 的垃圾回收器
查看>>
Class.forName()的作用
查看>>