2D阵列中的二进制搜索3

时间:2016-01-03 21:11:07

标签: c++

我需要在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;
}

程序找不到数组中的所有数字。 有些东西不起作用。

有什么问题?

2 个答案:

答案 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

代码:: http://ideone.com/9cwHnY

的Ideone链接