我需要在2D数组中找到一个数字。 列被排序(从最小值到最大值)。
这是我的代码:
const int SIZE = 4;
const int NOT_FOUND = 1;
int binarySearch(int mat[][SIZE], int &line , int num);
void main()
{
int num, index, mat[SIZE][SIZE] = { 11,1,5,11,
11,6,7,2,
8,7,7,7,
0,12,9,10 };
int line = sizeof(mat) / sizeof(mat[0][0]);
cout << "please type a number to search: " << endl;
cin >> num;
index = binarySearch(mat, line, num);
if (index == NOT_FOUND) {
cout << "The value: " << num << "doesn't exist in the array\n";
}
else {
cout << "The value: " << num << " exists in line " << line+1
<<" and column: " << index+1 << endl;
}
system("pause");
}
int binarySearch(int mat[][SIZE], int &line, int num)
{
for (int j = 0; j < SIZE; j++)
{
int low = 0;
int high = SIZE - 1;
int middle;
while (low <= high)
{
middle = (low + high) / 2;
if (num == mat[middle][j])
{
line = middle;
return j;
}
else if (num < mat[middle][j]) {
high = middle - 1;
{
else {
low = middle + 1;
}
}
}
return NOT_FOUND;
}
程序找不到数组中的所有数字。 有些东西不起作用。
有什么问题?
答案 0 :(得分:0)
您的binarySearch
未查看所有数字,它会检查第一个数字,因此在您的情况下 11 ,然后它会移到下一个数字,但它会跳过整个数字一行数字(1,5,11)和第二行中的第一个数字然后移动到下一个第二个数字,第二行将是 6 。
由于您有一个数字矩阵,它由行和列组成,这意味着您必须创建两个循环for(...)
,一次为行和一列用于列,这样您就可以浏览2D数组中的所有数字。
我建议在binarySearch
功能上设置一个断点并继续使用它,它会对你有所帮助。
答案 1 :(得分:0)
我在代码中看到的一些错误是::
1)您似乎正在对输入数组中的每一列应用二进制搜索,如果在相应列中找不到该数字,则递增j
并移至下一列。
关于二进制搜索最重要的是“您要搜索的数组应始终排序”。从这里开始搜索列,您的所有列都将被排序!在上面的代码中显示未分类!这是您找不到大多数元素的主要原因。所以,你的输入数组应该是这样的(如果你想应用二进制搜索)::
int mat[SIZE][SIZE] = { 0,1,5,2,
8,6,7,7,
11,7,7,10,
11,12,9,11 }
所有列都按升序排序!
2)您已将变量NOT_FOUND
的值设置为1
,并从函数中返回找到元素的列号。因此,如果您在列1
中的二维数组中找到了该元素,那么您的程序将打印Element Not Found
,因为如果在列{{}}中找到该元素,则条件if (index == NOT_FOUND)
将计算为true
{1}}。因此,更好的解决方案是将1
的值更改为某个负值,因为它永远不会是有效情况下的列号。像这样的东西::
NOT_FOUND
的Ideone链接