对关键字序列{3,5,7,10,12,13,18,22,34,45}采用折半查找。则查找18,需要进行的关键字的比较次数是( ) 次。(折半时,下标下取整)
时间: 2023-08-08 19:06:34 浏览: 73
折半查找的过程如下:
1. 将关键字序列按照从小到大的顺序排列:{3, 5, 7, 10, 12, 13, 18, 22, 34, 45}。
2. 确定关键字序列的中间位置,取中间位置的关键字(下标为4)和待查找关键字18进行比较,由于中间位置的关键字12小于18,因此在右半边继续查找。
3. 在右半边的关键字序列{13, 18, 22, 34, 45}中再次确定中间位置,取中间位置的关键字(下标为7)和待查找关键字18进行比较,由于中间位置的关键字22大于18,因此在左半边继续查找。
4. 在左半边的关键字序列{13, 18}中再次确定中间位置,取中间位置的关键字(下标为6)和待查找关键字18进行比较,由于中间位置的关键字18等于待查找关键字,查找成功。
因此,查找18需要进行的关键字的比较次数是3次。
相关问题
1.给定关键字序列(12,13,14,15,16,17,18,19,20,21,22),叙述采用折半查找关键字 12、28的过程,并计算平均查找长度。
好的,我来回答你的问题。
首先,折半查找也叫二分查找,它是一种高效的查找算法。在使用折半查找之前,需要先将待查找的序列按照关键字递增(或递减)的顺序排列。
对于给定的关键字序列(12,13,14,15,16,17,18,19,20,21,22),如果我们要查找关键字12和28,具体过程如下:
1. 初始化查找范围的左右端点left和right,分别指向序列的第一个和最后一个元素。
初始时,left=0,right=10。
2. 计算中间位置mid,mid=(left+right)/2,即mid=5。
3. 比较待查找的关键字12和序列中间位置的关键字17,由于12<17,所以应该在序列的左半部分继续查找。
4. 更新右端点right,right=mid-1,此时right=4。
5. 重新计算中间位置mid,mid=(left+right)/2,即mid=2。
6. 比较待查找的关键字12和序列中间位置的关键字14,由于12>14,所以应该在序列的左半部分继续查找。
7. 更新右端点right,right=mid-1,此时right=1。
8. 重新计算中间位置mid,mid=(left+right)/2,即mid=0。
9. 比较待查找的关键字12和序列中间位置的关键字12,由于二者相等,查找成功,返回元素下标0。
对于关键字28,在第6步比较待查找的关键字12和序列中间位置的关键字14时,由于12<14,所以应该在序列的右半部分查找。更新左端点left,left=mid+1,此时left=3;重新计算中间位置mid,mid=(left+right)/2,即mid=6。在第9步比较待查找的关键字28和序列中间位置的关键字18时,由于28>18,应该在序列的右半部分继续查找。更新左端点left,left=mid+1,此时left=7;重新计算中间位置mid,mid=(left+right)/2,即mid=8。在第9步比较待查找的关键字28和序列中间位置的关键字20时,由于28<20,应该在序列的左半部分继续查找。更新右端点right,right=mid-1,此时right=7;重新计算中间位置mid,mid=(left+right)/2,即mid=7。在第9步比较待查找的关键字28和序列中间位置的关键字19时,由于28>19,应该在序列的右半部分继续查找。更新左端点left,left=mid+1,此时left=8;重新计算中间位置mid,mid=(left+right)/2,即mid=9。在第9步比较待查找的关键字28和序列中间位置的关键字21时,由于28<21,应该在序列的左半部分继续查找。更新右端点right,right=mid-1,此时right=8;重新计算中间位置mid,mid=(left+right)/2,即mid=8。此时left=right=8,查找失败。
平均查找长度ASL是指平均查找一个元素所需的比较次数,公式为ASL=(log2n+1)/2,其中n为序列长度。对于本题中的序列,n=11,所以ASL=(log2(11)+1)/2≈1.5。
那如果这种可以构成折半查找关键字比较序列吗?180 500 200 450
这个序列可以进行折半查找,因为它是有序的。折半查找是一种高效的查找算法,适用于有序序列。具体步骤是:
1. 将序列按照升序或降序排列;
2. 取序列的中间值,如果要查找的值比中间值小,则在左半部分继续查找;如果要查找的值比中间值大,则在右半部分继续查找;
3. 重复以上步骤,直到找到要查找的值或者确定该值不存在。
例如,对于序列 [180, 200, 450, 500],要查找的值是 200,可以按照以下步骤进行折半查找:
1. 取中间值,得到 200;
2. 200 等于要查找的值,查找结束。
如果要查找的值是 300,按照以下步骤进行折半查找:
1. 取中间值,得到 200;
2. 300 大于中间值,继续在右半部分查找;
3. 取右半部分的中间值,得到 450;
4. 300 小于中间值,继续在左半部分查找;
5. 取左半部分的中间值,得到 180;
6. 300 大于中间值,继续在右半部分查找;
7. 取右半部分的中间值,得到 450;
8. 300 小于中间值,继续在左半部分查找;
9. 取左半部分的中间值,得到 200;
10. 300 大于中间值,继续在右半部分查找;
11. 取右半部分的中间值,得到 500;
12. 300 小于中间值,继续在左半部分查找;
13. 左半部分没有要查找的值,查找结束,该值不存在于序列中。