C++ -- 搜索未排序的数组

C++ -- Searching Unsorted Arrays

本文关键字:数组 排序 搜索 C++      更新时间:2023-10-16

我正在学习C++,并且正在玩搜索/排序算法。

我正在尝试对未排序的项目列表进行二叉搜索并返回原始数组索引。我必须首先对其进行排序,因此为了保留原始索引,我创建了一个 2D 数组,将数据放在第一列中,将原始索引放在第二列中。(我稍微缩减了一下,这就是为什么我不得不在这里放置//插入数据项。

template <class TYPE>
int SomeClass<TYPE>::find(TYPE data)
{
    TYPE(*ary)[2] = new TYPE[size()][2];
    for (int i = 0; i < size(); i++)
    {
        ary[i][0] = //insert data items here;
        ary[i][1] = i;
    }
    //reading the data items and indexes into the new 2D array works 
    someSort(ary, size());
    return bsearch(ary, 0, size()-1, data);
}

假设您有一些排序算法。例如,我将在下面放置气泡排序,因为它不占用太多空间来写入。

template <class DT>
void SomeClass<TYPE>::someSort(TYPE A[][2], int n)
{
    int i, j;
    for (i = 0; i < n- 1; i++)
    {
        for (j = 0; j < n- i - 1; j++)
        {
            if (A[j] > A[j + 1])
                swap(&A[j][0], &A[j + 1][0]);
        }
    }
}

好的,所以我的问题是您将如何修改 2D 数组的二进制搜索并返回原始值(位于数组的第二个插槽中(?(也可以随意修改我的排序示例,以防出现问题。

template <class TYPE>
int SomeClass<TYPE>::bsearch(TYPE A[][2], int left, int right, TYPE data)
{
    while (right>= left)
    {
        int mid = left + (right+ left) / 2;
        if (A[mid][0] == data)
            return A[mid][1];
        if (A[mid][0] > data)
            right= mid- 1;
        else
            left= mid+ 1; 
    }
    return -1;
}

您需要检查您的二叉搜索实现,因为它不正确。这是改进的版本:

template <class TYPE>
int SomeClass<TYPE>::bsearch(TYPE A[][2], int left, int right, TYPE data)
{
    while (right>= left)
    {
        int mid = left + (right - left) / 2; // <== corrected here.
        if (A[mid][0] == data)
            return A[mid][1];
        if (A[mid][0] > data)
            right= mid- 1;
        else
            left= mid+ 1; 
    }
    return -1;
}

在学习时,最好手动编写算法,但您应该知道C++为二进制搜索或快速/合并排序等常见算法提供了实现。

例如,您可以定义在原始数组中保存值和位置的值对struct vp

struct vp
{
    TYPE val;
    int pos;
    bool operator<(const vp& vp) const {
        return val < vp.val;
    }
    static bool cmp(TYPE b, const vp& a) {
        return b < a.val;
    }
};

然后,您可以使用 std::sort 对值对数组进行排序:

vp *arr = ...
std::sort(arr, arr+size());

然后,您可以使用lower_bound或upper_bound在值对数组中进行二叉搜索:

auto p = std::upper_bound(arr, arr+size(), data, vp::cmp);

但是您需要正确解释返回的值,以确定是否在数组中找到了值。