数据结构中的排序算法有:插入类排序、交换类排序、选择排序、堆排序、归并排序、桶排序。而 插入类排序包括:直接插入排序、折半插入排序、希尔排序。
其中:折半插入排序(稳定的排序)
原理步骤:
1)首先,利用折半查找法确定插入的正确位置;
2)其次,再一次性对元素进行移动;
3)最后,执行插入指令
先讲讲折半查找法:
折半查找也叫二分查找,该方法要求必须是线性存储结构。其原理就是每次与当前有序序列中间下标的数组进行比较,如果此时要插入的值比该A[mid]大,那么我就进入这个有序序列的右半部分继续进行查找,否则就进入左半部分继续查找。直到找到合适位置(low=high时)。
注:下列两种方法都是从小到大排序
方法一:建立哨兵(A[0]为哨兵,类似于中介变量,用于暂存元素值)
1 |
|
时间复杂度:O($n^2$)
注:
折半插入排序分为三个操作:比较(折半查找)、移动(插入位置的元素向后统一挪动一格)、插入(将元素插入到合适的位置上)。其中比较操作的时间复杂度为:O($nlogn$);移动操作的时间复杂度为:O($n^2$);插入操作的时间复杂度为:O(1)。所以总时间复杂度为:O($nlogn$)+O($n^2$)+O(1)=O($n^2$)
空间复杂度:O(1) 注:哨兵A[0](常数个空间)
方法二:设定一个中间变量temp(主流)
1 |
|
时间复杂度:O($n^2$)
注:
折半插入排序分为三个操作:比较(折半查找)、移动(插入位置的元素向后统一挪动一格)、插入(将元素插入到合适的位置上)。其中比较操作的时间复杂度为:O($nlogn$);移动操作的时间复杂度为:O($n^2$);插入操作的时间复杂度为:O(1)。所以总时间复杂度为:O($nlogn$)+O($n^2$)+O(1)=O($n^2$)
空间复杂度:O(1) 注:中间变量temp(常数个空间)`