使用if循环排序时出现意外结果-糟糕的算法

Unexpected result while sorting using if loops - Bad Algorithm

本文关键字:结果 算法 意外 循环 if 排序 使用      更新时间:2023-10-16

程序的目标是从文本文件中读取跑步者及其速度的随机数据,并将其组织为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_fpace_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;
         }
    }
}