【引入】
直接插入排序的序列特点是:有序序列+待插入元素+无序序列
分为两个步骤:第一:查找插入位置;第二:移动元素
既然是在有序序列中查找插入位置,因此可以想到用折半查找来寻找插入位置来减少数据比较的次数。
【注意】
1.并不是在任何情况下,折半插入排序都比直接插入排序的比较次数要少,在序列已经有序的情况下,直接插入排序只要比较一次即可,而折半插入要比较多次。
2.虽然降低了比较的次数,但是移动的次数并没有发生改变(两个算法找到的插入位置是相同的,所以要移动的元素也是相同的),而带来时间复杂度的主要因素还是移动,因此,折半插入排序的实际复杂度依然和直接插入排序的时间复杂度相同。
编程注意事项:
1.在low>high的时候停止查找,需要将【low~i-1】向后移动
2.移动后将num[0],复制到low所指向的位置,也就是high+1的位置
3.为了保证折半插入的稳定,在num[mid]==num[0]的时候应该在mid的右边寻找插入位置
疑问:最后要插入的位置是high+1其实high+1就是low&