活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。
思路过程
折半插入排序和插入排序不同的地方在于,插入排序寻找插入位置的方式是顺序查找,而折半插入排序的寻找插入位置的方式是折半查找。
算法图解
代码实现(C语言)
#include <stdio.h>
#define size 10
void sort(int *num, int len)
{
int i, j, low, high, mid, key;
for (i = 1; i < len; i++)
{
// 判断当前数据是否需要进行插入
if (num[i - 1] > num[i])
{
// 获取需要插入的数据
key = num[i];
// 初始查找范围为 [0, i-1](有序)
low = 0;
high = i - 1;
// 进行折半二分算法查找插入的位置
while (low <= high)
{
// 获取中间下标
mid = (low + high) / 2;
if (key <= num[mid])
{
// 如果key小于中间值,则缩小查找范围到左子序列
high = mid - 1;
}
else
{
// 如果key大于中间值,则缩小查找范围到右子序列
low = mid + 1;
}
}
// 整体后移
for ( j = i - 1; j >= high + 1; j--)
{
num[j + 1] = num[j];
}
// 插入数据
num[high + 1] = key;
}
}
}
算法评价
对基本有序的序列可能效果不是很理想。
实战演练
int searchInsert(int* nums, int numsSize, int target) {
int left = 0, right = numsSize - 1, ans = numsSize;
while (left <= right) {
int mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
}