【问题描述】 设有一整型查找表,利用二分查找法查找指定的关键字。 假设给出的查找表不确定是否排序,要求查找前,对查找表进行排序。 【输入形式】 输入若干组数据,每组数据包括: (1)输入整数n,表示查找表长度为n(n小于1000); (2)输入n个整数; (3)输入查找关键字key。 【输出形式】 若找到,输出关键字的位置序号(排序后的位置)及查找次数; 若未找到,输出“no”及查找次数。 【样例输入】 11 5 13 19 21 37 56 64 75 80 88 92 21 11 5 13 19 21 37 56 64 75 80 88 92 85 5 36 12 48 55 84 36 5 63 -9 54 12 100 55 【样例输出】 4 [3] no [3] 2 [3] no [2] 【样例说明】 【评分标准】 #include <stdio.h> #include <stdlib.h> #define MAX 100 int binarySearch(int list[],int n,int key,int *count) { } void sort(int list[], int n) { } int main() { int i,n,key,count=0; int a[MAX]; while(scanf("%d",&n)==1) { for(i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,n); scanf("%d",&key); if((i=binarySearch(a,n,key,&count))>=0) { printf("%d [%d]\n",i+1,count); }else { printf("no [%d]\n",count); } } return 0; }
时间: 2024-02-10 16:34:16 浏览: 112
这是一道关于二分查找的题目,需要输入一个整数n,表示有n个元素的查找表。然后输入n个整数,表示这个查找表,再输入一个关键字key,表示要查找的元素。要求对这个查找表进行排序后,再使用二分查找法查找关键字key,如果找到,输出关键字的位置序号以及查找次数,如果没有找到,输出"no"以及查找次数。
下面是一个可能的解法:
相关问题
【问题描述】 设有一整型查找表,利用二分查找法查找指定的关键字。 假设给出的查找表不确定是否排序,要求查找前,对查找表进行排序。 【输入形式】 输入若干组数据,每组数据包括: (1)输入整数n,表示查找表长度为n(n小于1000); (2)输入n个整数; (3)输入查找关键字key。 【输出形式】 若找到,输出关键字的位置序号(排序后的位置)及查找次数; 若未找到,输出“no”及查找次数。用折半查找
下面是用Python实现的代码:
```python
def binary_search(arr, key):
"""
二分查找算法
:param arr: 待查找的有序数组
:param key: 待查找的关键字
:return: 如果找到,返回关键字的位置序号及查找次数;如果未找到,返回"no"及查找次数
"""
# 先对数组进行排序
arr.sort()
low, high = 0, len(arr) - 1
count = 0 # 记录查找次数
while low <= high:
mid = (low + high) // 2
count += 1
if arr[mid] < key:
low = mid + 1
elif arr[mid] > key:
high = mid - 1
else:
return mid, count
return "no", count
n = int(input("请输入查找表长度n:"))
arr = []
for i in range(n):
arr.append(int(input("请输入第%d个整数:" % (i + 1))))
key = int(input("请输入待查找的关键字:"))
result = binary_search(arr, key)
if result[0] == "no":
print("未找到,查找次数为%d次。" % result[1])
else:
print("关键字的位置序号为%d,查找次数为%d次。" % (result[0], result[1]))
```
注意,这里的实现假设输入的查找表可能未排序,因此需要先进行排序。如果输入的查找表已经排序,则可以省略排序步骤,直接进行二分查找。
设有一整型查找表,利用二分查找法查找指定的关键字。 假设给出的查找表不确定是否排序,要求查找前,对查找表进行排序。 【输入形式】 输入若干组数据,每组数据包括: (1)输入整数n,表示查找表长度为n(n小于1000); (2)输入n个整数; (3)输入查找关键字key。 【输出形式】 若找到,输出关键字的位置序号(排序后的位置)及查找次数; 若未找到,输出“no”及查找次数。
好的,我会尽力回答。这是一个二分查找的问题,需要先对输入的整数序列进行排序,然后再进行查找。下面是对应的代码实现,您可以参考。
```
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n, key, cnt = 0;
while (cin >> n) {
int a[1000];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
cin >> key;
sort(a, a + n); // 对数组进行排序
int left = 0, right = n - 1, mid;
bool found = false;
while (left <= right) {
mid = (left + right) / 2;
cnt++;
if (a[mid] == key) {
found = true;
break;
} else if (a[mid] > key) {
right = mid - 1;
} else {
left = mid + 1;
}
}
if (found) {
cout << mid << ' ' << cnt << endl;
} else {
cout << "no " << cnt << endl;
}
}
return 0;
}
```
输入格式为:
```
n a[0] a[1] ... a[n-1] key
```
其中n为整数序列的长度,a[i]表示整数序列的第i个元素,key为要查找的关键字。
输出格式为:
```
如果找到,输出关键字的位置序号(从0开始,排序后的位置)及查找次数;
如果未找到,输出“no”及查找次数。
```
其中查找次数指的是在查找过程中比较关键字的次数。
阅读全文