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

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

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
}

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

相关文章
|
3月前
|
算法 Java C++
实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)
实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)
24 0
|
3月前
leetcode-57:插入区间
leetcode-57:插入区间
35 0
|
4月前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
29 0
使用二分查找在有序数组里面查找元素
返回所有跟所求值匹配的元素下标
|
6月前
|
算法
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
29 0
|
8月前
|
存储 算法
数组算法:倒置,查找,插入,删除
数组算法:倒置,查找,插入,删除
68 0
|
10月前
|
算法 安全 Swift
LeetCode - #57 插入区间
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #57 插入区间
|
10月前
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)上
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)上
46 1
|
10月前
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)下
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)下
57 0
|
算法
减治法实现插入排序,减治法实现二叉查找树(二叉搜索数,二叉排序数)的创建、插入与查找(含解析与代码实现)
减治法实现插入排序,减治法实现二叉查找树(二叉搜索数,二叉排序数)的创建、插入与查找(含解析与代码实现)