二分查找算法即折半查找,例如在一个有序数组中查找目标数应该插入到数组中的索引是多少?
假设一个数组如下:
int[] nums = { 1, 3, 5, 6 };
要计算把目标值插入到该数组中的索引值。最开始的思路:
1.先把目标数插入到数组中
2.进行排序
3.返回索引
代码如下:
public int SearchInsert(int[] nums, int target) { int index = System.Array.IndexOf(nums, target); if(index>=0) { return index; }else { List<int> list = nums.ToList(); list.Insert(nums.Length,target); nums = list.ToArray(); System.Array.Sort(nums,(num1,num2)=>{return num1-num2;}); return System.Array.IndexOf(nums, target); } }
后面学习到可以用二分法来解决,代码如下:
public static int SearchInsert(int[] nums, int target) { int start = 0;//开始索引 int end = nums.Length - 1;//结束索引 int mid = 0;//取中间索引 while (start <= end) { mid = start+(end - start) / 2; if (target == nums[mid]) { return mid; } if (nums[mid] > target) { end = mid - 1; } else if (nums[mid] < target) { start = mid + 1; } } return start; }
代码解析:
二分查找的思路是
1.定义查找范围。start, end 开始索引和结束索引
2.折半缩小查找范围即mid=start+(end - start) / 2;防止数值溢出
如果目标数大于对半的数,则要插入的数在对半的右边,则开始查找的范围就需要更改为 start=mid+1;即对半之后的下一个数
如果目标数小于对半的数,则要插入的数在对半的左边,则结束查找的范围就需要缩短到 end=mid-1;即对半的前一个数
3.折半一次还没有找到就需要再次进行折半,重复步骤2的操作