常用排序算法-直接插入排序
介绍
直接插入排序算法是一种简单,直观且稳定的排序算法。直接插入排序的基本思路是将一个元素插入到已经排好序的序列中,从而得到一个新的有序序列。
原理
直接插入排序的原理就好比抓扑克牌一样,我们每新抓到一张扑克后,会扫描已经有序的扑克牌,以升序为例,从大到小扫描扑克牌,当出现扑克小于当前的新扑克时,将新扑克牌插入到该牌的后面,即可得到一个新的有序序列。
以[6,2,5,8,7]为例可以将数组分为两个子集,其中左子集是有序的,而右子集是待插入元素,当子集中只有一个元素时,显然是有序的。我们将2插入到有序子集中,6大于2,则将6向后移动一个位置,此时有序子集中的元素都比新元素2大,则将2插入到前面,实际上就是索引为0的位置,依次将右子集的元素插入到有序子集中,最终会得到一个排好序的数组。
初始数组 | 6 | 2 | 5 | 7 | 8 | |
第一趟 | 2 | 6 | 5 | 7 | 8 | |
第二趟 | 2 | 5 | 6 | 7 | 8 | |
第三趟 | 2 | 5 | 6 | 7 | 8 | |
第四趟 | 2 | 5 | 6 | 7 | 8 |
程序
public class InsertSort { public static void insertSort(int[] arr){ if(arr == null || arr.length == 0) throw new IllegalArgumentException("error"); for(int i = 1; i < arr.length; ++i){ int index = i - 1; int insertNum = arr[i]; while(index >= 0 && arr[index] > insertNum){ arr[index+1] = arr[index]; index--; } arr[index+1] = insertNum; } } }
总结
直接插入排序的时间复杂度最差为O(n^2),最好情况时O(n),平均时间复杂度为O(n^2)。
同时直接插入排序是在原数组上直接进行操作,空间复杂度是O(1)。
由于直接插入排序的原理,后面的元素插入到已排序数组中,若遇到相同元素则直接放在后面,不难推断出是稳定的。
相关推荐
shawsun 2020-02-12
yishujixiaoxiao 2019-12-23
TTdreamloong 2012-11-06
微分 2015-01-08
gotea 2012-08-30
sxyyu 2019-07-01
算法的天空 2019-07-01
horizonheart 2013-03-15
tingke 2018-01-15
yhguo00 2018-04-29
tingke 2017-02-28
龙源潇俊 2015-07-18
tansuo 2014-12-12
xiekch 2011-04-12
PHP100 2019-03-28
BitTigerio 2018-04-21