给定一个按值有序(升序)的n元整数数组a,采用折半查找法查找关键值k的位置,并给出查找的过程
时间: 2023-05-31 13:18:58 浏览: 371
### 回答1:
给定一个按值有序(升序)的n元整数数组a,采用折半查找法查找关键值k的位置,查找过程如下:
1. 首先,将数组a的第一个元素设为left,最后一个元素设为right。
2. 然后,计算出数组a的中间位置mid,即(left+right)/2。
3. 比较数组a的第mid个元素和关键值k的大小。
4. 如果a[mid]==k,则说明已经找到了关键值k,返回mid。
5. 如果a[mid]>k,则说明关键值k在数组a的左半部分,此时将right设为mid-1,并重复步骤2~4。
6. 如果a[mid]<k,则说明关键值k在数组a的右半部分,此时将left设为mid+1,并重复步骤2~4。
7. 如果left>right,则说明在数组a中没有关键值k,返回-1。
### 回答2:
折半查找法是一种高效的查找算法,也称为二分查找法。对于已经按值有序的n元整数数组a,我们可以使用折半查找法来查找关键值k的位置。在进行折半查找之前,我们需要先了解一下该算法的过程。
1.确定查找范围
由于数组a是按升序排列的,我们可以将查找范围限定在数组的两端,即左端i和右端j。初值时,i=0,j=n-1。
2.计算中间位置
我们计算出中间位置mid=(i+j)/2,然后将要查找的值k与数组中mid位置上的值进行比较。
3.调整查找范围
如果要查找的值k小于mid位置上的值,说明要查找的值在mid的左边。此时,将查找范围限定在i~mid-1之间,即j=mid-1。如果要查找的值k大于mid位置上的值,则要查找的值在mid的右边。此时,将查找范围限定在mid+1~j之间,即i=mid+1。
4.重复查找
重复执行步骤2、步骤3,直到找到要查找的值或者查找范围缩小到只有一个元素时。如果找到要查找的值k,则返回该元素在数组中的位置;否则,找不到要查找的值,返回-1。
下面给出一个示例,以帮助更好地理解折半查找法的过程:
假设给定一个按升序排列的数组a={3, 5, 7, 9, 11, 13, 15, 17, 19, 21},我们要查找关键值为13的位置。
首先,我们将查找范围限定在数组的两端,即i=0,j=9。
第一次查找,我们计算出mid=(i+j)/2=4,即数组元素a[4]=11。由于要查找的值k=13大于a[4],于是我们将查找范围调整为mid+1~j=5~9。第二次查找,计算出mid=(5+9)/2=7,即数组元素a[7]=17。由于要查找的值k小于a[7],于是我们将查找范围调整为i~mid-1=5~6。第三次查找,计算出mid=(5+6)/2=5,即数组元素a[5]=13。由于查找到了要查找的值13,返回该元素在数组中的位置5。
通过以上示例,我们可以清楚地了解到折半查找法的过程。折半查找法的时间复杂度为O(log2 n),效率非常高。使用折半查找法时,需要注意数组必须是按值有序的。
### 回答3:
折半查找法,也叫作二分查找法,是一种高效的查找算法。它的基本思路是:在按值有序的数列中查找某一特定值,每次查找时,将待查找区间缩小一半,直到找到或确定该值不存在为止。
假设给定一个按值有序(升序)的n元整数数组a,要查找关键值k的位置。则折半查找过程如下:
首先,取数列a的中间位置m,比较a[m]和k的大小:
如果a[m]==k,说明找到了关键值k,返回m的位置。
如果a[m]>k,说明k在左半部分,将查找区间缩小到左半部分,继续执行第一步。
如果a[m]<k,说明k在右半部分,将查找区间缩小到右半部分,继续执行第一步。
以上三个步骤可以用递归或非递归的方式实现。
递归实现:
1.定义折半查找函数,设置参数列表为待查找数列a、查找区间左右端点l和r、目标值k。
int binary_search(int a[], int l, int r, int k)
{
if(l > r) //如果查找区间为空,说明目标值不存在,返回-1。
return -1;
int m = (l + r) / 2; //计算查找区间的中间位置
if(a[m] == k) //如果中间位置的值就是目标值,返回该位置。
return m;
else if(a[m] > k) //如果中间位置的值大于目标值,将查找区间缩小到左半部分
binary_search(a, l, m-1, k); //递归搜索a[l...m-1]区间
else //如果中间位置的值小于目标值,将查找区间缩小到右半部分
binary_search(a, m+1, r, k); //递归搜索a[m+1...r]区间
}
2.在主函数中调用该函数,并输出结果。
int main()
{
int n = 10;
int a[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
int k = 11;
int pos = binary_search(a, 0, n-1, k);
if(pos == -1)
cout << "元素 " << k << " 不存在!" << endl;
else
cout << "元素 " << k << " 在数组中的位置为:" << pos << endl;
return 0;
}
非递归实现:
1.定义折半查找函数,设置参数列表为待查找数列a、数组长度n、目标值k。
int binary_search(int a[], int n, int k)
{
int l = 0, r = n-1; //初始化查找区间l和r
while(l <= r) //如果查找区间不为空
{
int m = (l + r) / 2; //计算查找区间的中间位置
if(a[m] == k) //如果中间位置的值就是目标值,返回该位置。
return m;
else if(a[m] > k) //如果中间位置的值大于目标值,将查找区间缩小到左半部分
r = m - 1;
else //如果中间位置的值小于目标值,将查找区间缩小到右半部分
l = m + 1;
}
return -1; //查找失败,返回-1
}
2.在主函数中调用该函数,并输出结果。
int main()
{
int n = 10;
int a[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
int k = 11;
int pos = binary_search(a, n, k);
if(pos == -1)
cout << "元素 " << k << " 不存在!" << endl;
else
cout << "元素 " << k << " 在数组中的位置为:" << pos << endl;
return 0;
}
总之,折半查找法是一种高效的查找算法,时间复杂度为O(logn),适用于按值有序的数组。无论是递归实现还是非递归实现,都需要注意查找区间的边界和终止条件,否则容易出错。
阅读全文
相关推荐















