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

Binary Search in 2D Array 3

本文关键字:二进制 搜索 阵列 2D      更新时间:2023-10-16

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

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

问题出在哪里?

您的binarySearch不会遍历所有数字,它会检查第一个数字,因此在您的情况下11,它会移动到下一个数字,但它会跳过整行数字(1,5,11)和第二行的第一个数字然后移动到第二行中的下一个第二个数字,即6

由于您有一个数字矩阵,它由组成,这意味着您必须创建两个循环for(...),一个用于行,另一个用于列,这样您就可以遍历2D阵列中的所有数字。

我建议在binarySearch函数上设置一个断点,并完成它,这将对您有很大帮助。

我在您的代码中看到的一些错误是::

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的2D数组中找到元素,您的程序将打印Element Not Found,因为如果元素在列1中找到,则条件if (index == NOT_FOUND)计算为true。因此,更好的解决方案是将NOT_FOUND的值更改为某个负值,因为在有效的情况下,它永远不可能是列号。类似以下内容::

const int NOT_FOUND = -1;

Ideone代码链接:http://ideone.com/9cwHnY