TIPS:插入排序分为直接插入排序和希尔排序,其中最重要的就是希尔排序;最好能够手动模拟出希尔排序的执行过程,并掌握希尔排序手动模拟过程及其性质(如稳定性等)。
插入排序,算法思想:
每次将待排序的记录按其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成;插入排序中,可继续分为:直接插入排序和折半插入排序和希尔排序。
比起直接插入排序,折半插入排序是对前面已经好顺序的序列进行关键字的比较所进行的优化;一般情况下,通过折半查找方式,关键字的比较次数 变少了,但是移动元素的次数没变,整体时间上看,时间复杂度依然是O(n2)。
TIPS:折半插入排序中,当low>high时(low=high+1),将low之后到子序列结束的所有元素右移,并将当前要插入的元素放入low所指位置;且当要插入的值等于当前所指元素时,应继续令low=high+1,来保证稳定性。
总结:插入排序的平均时间复杂度O(N^2;空间复杂度为O(1);且算法是稳定的。
希尔排序——shell sort,算法思想:
通过设置一个逐渐减小的d值,将表按照d值分割,对各个子表进行直插排序,然后逐渐缩小增量d,直到d=0位置,效果形同:通过部分有序,逼近总体有序。
总结:希尔排序的空间复杂度为O(1),时间复杂度一般不讨论,但优于直插排序;希尔排序是不稳定的; 希尔排序仅适用于顺序表,不适用于链表;