我的写法
//求出序列中第一个大于等于x的元素的位置L
int getL(int A[], int left,int right,int X)
{
//因为位置L等价于不存在X时X在A中的位置,所以初始left=0 right=n
//比如说X比当前数组中所有的数都大,则X的位置应为n
while (left < right)
{
int mid = left + (right - left) / 2;
if (A[mid] == X)
{
right = mid;
}
else if (A[mid] > X)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return left;
}
//第一个大于x的元素位置R
int getR(int A[], int left, int right, int X)
{
//初始left==0 right==n
while (left < right)
{
int mid = left + (right - left) / 2;
if (A[mid] > X)
{
right = mid-1;
}
else
{
left = mid + 1;
}
}
return left;
}
书本写法
//求出序列中第一个大于等于x的元素的位置L
int getL(int A[], int left,int right,int X)
{
//因为位置L等价于不存在X时X在A中的位置,所以初始left=0 right=n
//比如说X比当前数组中所有的数都大,则X的位置应为n
while (left < right)
{
int mid = left + (right - left) / 2;
if (A[mid] >= X)
{
right = mid;//往左子区间[left,mid]查找
}
else
{
left = mid + 1;//往右子区间[mid+1,right]查找
}
}
return left;
}
//第一个大于x的元素位置R
int getR(int A[], int left, int right, int X)
{
//初始left==0 right==n
while (left < right)
{
int mid = left + (right - left) / 2;
if (A[mid] > X)
{
right = mid;//往左子区间[left,mid]查找
}
else
{
left = mid + 1;//往右子区间[mid+1,right]查找
}
}
return left;
}
反思
- 这两种写法对A[mid]>X的选择都狭隘了,格局小了,因为此时A[mid]很有可能就是所要找的那个位置的值,所以不能再缩小范围