我试图实现一种搜索给定数组中最小和最大元素的算法,并使用Cormen的算法简介中的思路。我的代码编译并开始工作,输出生成的随机数组,然后在很长一段时间内什么都不做。 为什么会这样?
代码是这样的:
// fast min and max --cormen exercise 1.cpp: entry point
//implemented from a verbal description in cormen's book, p 243
#include "stdafx.h"
#include <vector>
#include <ctime>
#include <cstdlib>
#include <iostream>
struct min_and_max
{
int min, max;
};
min_and_max find_min_and_max(std::vector<int>& A)
{
int n = A.size();
int min, max;
if (n%2 == 1)
min = max = A[0];
if (n%2 == 0)
if (A[0] < A[1])
{
min = A[0];
max = A[1];
}
else
{
min = A[1];
max = A[0];
}
for(int i = 2; i < A.size(); (i + 2))
{
if (A[i] < A[i+1])
{
if (min > A[i])
min = A[i];
if (max < A[i+1])
max = A[i+1];
}
else
{
if (min > A[i+1])
min = A[i+1];
if (max < A[i])
max = A[i];
}
}
min_and_max result;
result.min = min;
result.max = max;
return result;
}
int main()
{
std::srand(std::time(0));
std::vector<int> A(10);
for (auto i = 0; i < A.size(); i++)
{
A[i] = rand() % 1000;
std::cout << A[i] << " ";
}
std::cout << std::endl; //IT GOES AS FAR AS THIS
std::cout << "The array has been analyzed; its' minimum is " << find_min_and_max(A).min << "and its' maximum is " << find_min_and_max(A).max << std::endl;
return 0;
}
答案 0 :(得分:7)
for(int i = 2; i < A.size(); (i + 2))
i + 2
不会更改i
的值,您需要使用i += 2
。
答案 1 :(得分:4)
问题在于:
for(int i = 2; i < A.size(); (i + 2))
你永远不会实际增加i
,从而导致无限循环。
将其更改为:
for(int i = 2; i < A.size(); i+=2)
答案 2 :(得分:2)
除了给定答案之外,如果您使用的是c ++ 11,则可以使用lambdas和std::for_each
函数简化算法:
#include <algorithm>
#include <iostream>
#include <cmath>
int main() {
int array[] = { -8, 8, 0, 9, 5, -3, 4, 6, -1, 15, 31 };
int min, max;
// User std::for_each(v.begin(), v.end(), ...) for either vector or list
std::for_each(std::begin(array), std::end(array), [&min, &max](int elem) {
max = std::max(max, elem);
min = std::min(min, elem);
});
std::cout << min << ", " << max << std::endl;
return 0;
}
也许它可能更简单
更新:正如@Blastfurnace指出的那样,std::minmax_element
函数可用于进一步减少搜索min和max元素所需的代码,从而产生更短的版本:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> values = { -8, 8, 0, 9, 5, -3, 4, 6, -1, 15, 31 };
auto minAndMax = std::minmax_element(values.begin(), values.end());
std::cout << *minAndMax.first << ", " << *minAndMax.second << std::endl;
return 0;
}
重要的是要注意,除了OT之外,在这个答案中所做的一切都是为了学习,提供OP替代方案以改进他(或她)的工作并帮助其他可能具有相同功能的用户要求。
答案 3 :(得分:0)
在任何情况下算法都是不正确的,因为向量的大小可以等于0.在这种情况下1)您尝试访问不存在的alements和2)从函数返回未定义的值。更正确的方法是返回最小和最大元素的索引,如果向量为空,则返回一对A.size()。