#include<iostream> using namespace std; struct lookupdata { char*key; int value; }; lookupdata data[]={{"a",12},{"b",11},{"c",15},{"d",98}}; int sx(int value,int n) { for(int i=0;i<n;i++) { if(value==data[i].value) { return i; } } return -1; } int zb(int value,int l,int h,int n) { for(int i=0;i<n;i++) { for(int j=0;j<n-1-i;j++) { if(data[j].value>data[j+1].value) { lookupdata temp=data[j]; data[j]=data[j+1]; data[j+1]=temp; } } } int mid=(l+h)/ 2; while(h>=l) { if(value==data[mid].value) { return mid; } else if(value>data[mid].value) { l=mid+1; } else { h=mid-1; } } return -1; } int main() { cout<<"顺序查找后的下标值为:"<<sx(11,4)<<endl; cout<<"折半查找的下标值为:"<< zb(11,0,3,4) <<endl; return 0; }最终结果错误代码错在哪里
时间: 2024-01-03 10:03:31 浏览: 80
这段代码的问题在于 `zb` 函数中的排序过程,并没有实现对键值对数组 `data` 的排序,而是对一个大小为 `n` 的局部数组进行排序。因此,在进行折半查找时,可能会得到错误的结果。此外,`zb` 函数中的循环条件也存在问题,应该是 `while (h >= l)` 而不是 `while (l <= h)`。
下面是修改后的代码:
```cpp
#include<iostream>
using namespace std;
struct lookupdata {
char* key;
int value;
};
lookupdata data[] = {{"a", 12}, {"b", 11}, {"c", 15}, {"d", 98}};
int sx(int value, int n) {
for (int i = 0; i < n; i++) {
if (value == data[i].value) {
return i;
}
}
return -1;
}
int zb(int value, int l, int h, int n) {
// 对 data 数组按照 value 进行排序
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (data[j].value > data[j + 1].value) {
lookupdata temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
}
}
}
int mid = (l + h) / 2;
while (h >= l) {
if (value == data[mid].value) {
return mid;
}
else if (value > data[mid].value) {
l = mid + 1;
}
else {
h = mid - 1;
}
mid = (l + h) / 2;
}
return -1;
}
int main() {
cout << "顺序查找后的下标值为:" << sx(11, 4) << endl;
cout << "折半查找的下标值为:" << zb(11, 0, 3, 4) << endl;
return 0;
}
```
注意,这里只是修改了代码中的问题,但并没有对算法本身进行优化。实际上,对于这种小规模的数据,顺序查找的效率可能比折半查找更高,因为折半查找需要先排序,而排序本身也需要时间。对于大规模数据,折半查找的效率才会得到充分的发挥。
阅读全文