折半(二分)查找、插入相关问题

简介: 折半(二分)查找、插入相关问题

704. 折半查找(二分)

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,
写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

输入: nums = [-1,0,3,5,9,12], target = 9

输出: 4

解释: 9 出现在 nums 中并且下标为 4

注意 此题说明是查找,那么数组中一定有target数,所以,我写了if(target==nums[mid]){

return mid;//返回数组下标

}

int search(int* nums, int numsSize, int target){//nums是数组,size是数组的大小,target是需要查找的值
    int low,high,mid;//low左边,high右边,mid中间
    low = 0;//赋初值,指向最左
    high = numsSize-1;//指向最右
    while(low<=high){//这里写的不一样,会直接影响后面代码
        mid = low+(high-low)/2;//为了防止溢出
        if(target==nums[mid]){
            return mid;//返回数组下标
        }
        if(target>nums[mid] ){
            low = mid+1; 
        }
        if(target<nums[mid]){
            high = mid -1;
        }
    }
    return -1;
}

折半插入(二分)

基本思想

折半插入排序,又称二分插入排序,先用折半查找1找到应该插入的位置,再移动元素

步骤(从小到大排序)

找到没有排序的元素

标记元素

对前面排好序的元素进行折半,low、high 上下界,mid标记为中间的元素

将标记元素与 mid 位置上的元素进行比较,如果标记元素<mid 位置上的元素,则应该插入到mid 的左边,high=mid-1;如果标记元素>mid 位置上的元素,则应该插入到 mid 的右边,low=mid+1。重复第3步

当 low>high 时停止折半查找,将[low,i-1]内的元素全部右移,并将标记元素插入到 low 所指的位置

例如:有数组nums = [-1,0,3,9];插入元素x= 5;

示意图:

void blnsertsort(int* nums, int numsSize, int x) {
    int low = 0;
    int high = sumSize - 1;
    int mid = 0;
    while (low <= high) {
        mid = low + (high - low) / 2;//防止溢出
        if (x > nums[mid])
            low = mid + 1;
        else//x小于后者等于nums[mid]
            high = mid - 1;
    }
    //此时high<low;high+1为插入位置
    for (int i = sumSize - 1; i > high; --i) {//后移
        nums[i + 1] = nums[i];
    }
    nums[high + 1] = x;//c插入x
}

*个人理解,如有不同见解,敬请指出!

相关文章
【Leetcode -1609.奇偶树 -1122.数组的相对排序】
【Leetcode -1609.奇偶树 -1122.数组的相对排序】
53 0
|
7月前
|
人工智能 C++
查找题(二分解法c++)
查找题(二分解法c++)
60 0
|
7月前
|
存储 索引
每日一题——寻找右区间(排序 + 二分查找)
每日一题——寻找右区间(排序 + 二分查找)
|
7月前
|
存储 搜索推荐 算法
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(一)
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(一)
|
7月前
|
存储 搜索推荐 算法
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(二)
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(二)
|
7月前
|
人工智能 算法 BI
【前缀和】【分类讨论】【二分查找】2983:回文串重新排列查询
【前缀和】【分类讨论】【二分查找】2983:回文串重新排列查询
|
7月前
【每日一题Day157】LC1574删除最短的子数组使剩余数组有序 | 双指针 + 二分查找
【每日一题Day157】LC1574删除最短的子数组使剩余数组有序 | 双指针 + 二分查找
48 0
|
7月前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
61 0