文章目录[隐藏]
折半插入排序又称二分法插入排序。和直接插入排序算法不同的是:在插入元素时,利用折半搜索法寻找插入位置。
算法思想:
过程同直接插入排序,仅仅是在找插入位置时,不是顺序遍历,而是二分法查找位置。因为:如果要找地 i 个元素的插入位置,那么第 i-1 个元素是已经有序的,可以用二分查找来寻找位置。
算法分析:
时间复杂度:折半插入排序仅仅是减少了比较元素的次数,约为O(nlogn),而且该比较次数与待排序表的初始状态无关,仅取决于表中的元素个数n;而元素的移动次数没有改变,它依赖于待排序表的初始状态。因此,折半插入排序的时间复杂度仍然为O(n²),但它的效果还是比直接插入排序要好。
空间复杂度:排序只需要一个位置来暂存元素,因此空间复杂度为O(1)
二分法插入排序模块源码
.版本 2 .子程序 二分法插入排序 .参数 参数组, 整数型, 数组 .局部变量 排序变量, 整数型, , "0" .局部变量 当前查找次数, 整数型 .局部变量 数据成员数量, 整数型 .局部变量 插入位置, 整数型 .局部变量 当前数据, 整数型 .局部变量 当前分区成员数, 整数型 .局部变量 当前位置, 整数型 .局部变量 中间位置, 整数型 .局部变量 中间数据, 整数型 数据成员数量 = 取数组成员数 (参数组) .如果真 (数据成员数量 ≤ 0) 返回 () .如果真结束 .计次循环首 (数据成员数量, 当前查找次数) 当前位置 = 1 当前分区成员数 = 取数组成员数 (排序变量) 当前数据 = 参数组 [当前查找次数] ' 本源码来自易语言资源网(www.5A5X.com) .判断开始 (当前查找次数 = 1) 插入成员 (排序变量, 1, 当前数据) ' 加入第一个成员 到循环尾 () .判断 (当前数据 ≥ 排序变量 [当前分区成员数]) 插入成员 (排序变量, 当前分区成员数 + 1, 当前数据) ' 用无序数据比较数组的最大位 到循环尾 () .判断 (当前数据 ≤ 排序变量 [1]) ' 用无序数据比较数组的最小位 插入成员 (排序变量, 1, 当前数据) 到循环尾 () .默认 .判断结束 ' 条件成立,继续拆,直至找到“当前数据”等于“中间数据”或者直至当前的查找区间为空(即失败)为止。 .判断循环首 (当前位置 < 当前分区成员数 - 1) ' 二分排序的结构 ' 取有序区中间位置,将分区减半进行查找 中间位置 = (当前位置 + 当前分区成员数) \ 2 ' 取有序区中间位置的数据 中间数据 = 排序变量 [中间位置] .如果真 (当前数据 = 中间数据) 当前位置 = 中间位置 跳出循环 () .如果真结束 .如果 (当前数据 < 中间数据) 当前分区成员数 = 中间位置 ' 其插入位置在左分区 .否则 当前位置 = 中间位置 ' 其插入位置在右分区 .如果结束 .判断循环尾 () 插入位置 = 当前位置 + 1 插入成员 (排序变量, 插入位置, 当前数据) ' 插入位置 = 1 .计次循环尾 () 复制数组 (参数组, 排序变量)