C++ -- 搜索未排序的数组
C++ -- Searching Unsorted Arrays
我正在学习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);
但是您需要正确解释返回的值,以确定是否在数组中找到了值。
相关文章:
- 显示错误输出的简单数组排序程序
- C 使用单个函数对具有多种值类型的数组排序
- 2D数组排序,空格打乱顺序
- C 2D数组排序
- C++数组排序 - 将"bbba"和"0001"视为不正确排序的问题
- 数组排序功能
- CString 数组排序
- 简单的数组排序/检查 划分和征服版本
- C++ 中的多维数组排序
- 选择在++中对并行数组排序
- C++:二维指针数组排序:选择排序不适用于某些实例
- C++字符串数组排序
- C++中的指针数组排序算法
- 在VC++6中使用向量进行数组排序时出错,而在VC++2012中没有错误
- 将索引数组排序为主数组
- 数组排序、数组输入、数组输出
- C++数组排序,内存错误
- 在嵌入式系统上将数组排序功能从c++移植到c
- 基于其他int数组排序
- 多维数组排序c++奇怪行为