插入排序
插入排序是排序算法的一种,顾名思义,是一种插入的形态进行排序的算法
原理
插入排序的过程可以形象的比做我们打扑克抓牌时,整理扑克牌的过程,每次我们抽一张新牌时,会以特定的规律,将其插入到已有的牌中,使手中的牌形成一个有序的牌的集合
插入排序也是如此我们使用两个嵌套的for
循环从头开始遍历一个序列,外部的for
循环顺序向下执行,内部的for
循环负责比较其当前遍历的位置元素是否小于(或大于)它前面的所有元素,如果是,就调换其位置,以此类推,最后得到一个有序的序列
Java 代码
1 | public static void insertionSort(int[] nums) { |
思考
从插入排序的定义中我们可以发现,如果一个尽量有序的序列,例如[1, 2, 3, 4, 0]
,实际上插入排序的效率是接近O(N)
的,因为它的内层循环实际上只运行了一次,所以插入排序十分适合对已经尽量有序的序列来进行排序
优化插入排序——希尔排序
为了优化插入排序,我们可以先使数组尽可能多的有序化,或者说局部有序化,希尔排序就诞生了
原理
希尔排序的原理是通过间隔h
分组,将原序列分成又干个不相邻的间隔为h
的两两一组的序列,对这两个元素进行插入排序,然后缩小间隔h
,再两两进行插入排序,在这个过程中,原序列会从无序越来越趋近于有序,当h = 0
时,虽然是对整个序列进行插入排序,但此时序列已经相对的更加有序,所以效率会得到提高
Java 代码
1 | public static void shellsort(int[] nums) { |