使用if循环排序时出现意外结果-糟糕的算法
Unexpected result while sorting using if loops - Bad Algorithm
程序的目标是从文本文件中读取跑步者及其速度的随机数据,并将其组织为First、Second和Third。上面有他们的名字、号码布、年龄、性别和年龄。然而,在这个程序中,我不能使用STL/数组等,仅限于整型,双精度和字符串。
代码比较跑步者的速度。这是我用过的一个算法
int pace_f = 100000;
int pace_s = 100000;
int pace_t = 100000;
if ((pace < pace_t) && (pace > pace_s))
{
name_t = name;
min_t = min;
sec_t = sec;
pace_t = pace;
}
if ((pace < pace_s) && (pace > pace_f))
{
name_s = name;
min_s = min;
sec_s = sec;
pace_s = pace;
}
if (pace < pace_f)
{
name_f = name;
pace_f = pace;
}
错误出现在正确显示First和Second位置的输出中。然而,它有时无法打印出第三个位置或提供错误的位置。我理解它这样做是因为它比较第一次传递给循环的值,因为它总是低于10,000,所以它将其设置为第三最佳时间。现在,当一个更好的时间到来时,它取代了第三位的那个,因为它满足了所有其他条件。当传递的前三个步长值按升序排列时,程序将正确运行。
所以我的问题是-我怎样才能纠正错误,使它工作,而不需要你的数字是升序的,否则这只是毫无意义的
我将指出这部分现有代码的逻辑问题:
if (pace < pace_f)
{
name_f = name;
pace_f = pace;
}
您的其他if
语句也有相同的问题,但是在这里更容易解释问题,然后您可以对所有其他语句应用相同的修复。
在这里,你已经决定你的下一个配速水平比目前的第一名要好。现在,当前记录pace
是第一名,您需要相应地更新第一名记录name_f
和pace_f
。
但是你忽略了一个细节,你现在的第一名是你现在的第二名,你现在的第二名是你现在的第三名。
你刚刚找到了一个比你的前三名更快的记录,所以这一定意味着你现有的最好成绩现在是第二好成绩,而你现有的第二好成绩现在是第三好成绩。
所以,在你可以更新你的第一名的节奏和名字之前,你需要把你现有的第二名的名字和节奏移动到第三名的名字和节奏;把你现有的第一名的名字和步伐改为第二名的名字和步伐;只有在完成之后,你才能更新你的第一名和排名。
此外,您可以通过重新排列它们彼此的相对顺序来简单地进行比较。
如果你能先比较第一名的速度,那么else
部分就可以用来测试剩余的可能性。一旦你排除了你有最好的第一步的可能性,测试剩下的可能性就更简单了。
你的整体逻辑应该是:
if (pace < pace_f)
{
// Move the second place name+pace to third place
// Move the first place name+pace to the second place
// Set the new first place pace.
}
else if (pace < pace_s)
{
// Move the second place name+pace to third place
// Set the new second place pace.
}
else if (pace < pace_t)
{
// Set the new third place pace.
}
。
只需这样做即可。
这个想法是当一个数字比第一个好我们应该保留新的第一,旧的第一和旧数据中的第二。
const int MAX = (int) 1e9; //INT_MAX from <climits> also to be considered
int num1,num2,num3,curr;
string name1,name2,name3,currName;
int main (){
//the number of data to be entered
cin>>runnersNum;
num1=num2=num3=MAX;
name1=name2=name3="No Name Yet";
while (runnersNum--){
cin>>curr>>currName;
if (curr>=num1){
if (num3!=MAX&&num2!=MAX) {
swap(num2,num3); swap(name2,name3);
swap(num1,num2); swap(name1,name2);
num1=curr; name1=currName;
}
}
if (curr>=num2){
swap(num2,num3); swap(name2,name3);
num2=curr; name2=currName;
}
if (curr>=num3){
num3=curr; name3=currName;
}
}
}
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 是否可以使用 Wojciech Mula 算法将 __m256i 个 32 位字而不是 4 个 64 位字存储为弹出计数和结果?
- 选择排序算法生成无序结果
- 使用算法中的插入函数将元素插入空容器中,未给出预期的结果
- 微小加密算法实现会产生意想不到的结果
- 为什么我的Cooley-Tukey和蛮力(傅立叶)算法给出的结果非常不同
- 为什么在 C++ 中实现高斯勒让德算法没有产生结果
- 反向 Cuthill-McKee 算法:在 Matlab 和提升实现中具有无与伦比的结果
- base64算法具有C 因子的多重结果
- 排序算法给出错误的结果
- 使用Dijkstra算法找到最佳路径的不可预测的结果
- 使用if循环排序时出现意外结果-糟糕的算法
- 我的算法是正确的,但有些结果是错误的?(c++)
- Random_shuffle算法-在没有随机生成器函数的情况下产生相同的结果
- 查找可能不返回任何结果的最佳匹配的算法
- C++:查找直角三角形算法没有得到预期的结果
- 我必须训练维奥拉-琼斯算法与我的数据库,以获得准确的结果