排序算法在for循环中不加1

Sorting algorithm not incrementing in for loop

本文关键字:循环 算法 for 排序      更新时间:2023-10-16
void sortRooms()

我想出了这个算法来排序我的房间结构。在房间结构中只有3个值(50,120,30),这就是为什么我必须在开始时减少索引并每次增加dec 1。然而,当我编译时,它打印出

OHE 100 120
SAL 210 30
OHE 120 50

我在纸上跟踪了步骤,但我无法理解为什么索引没有正确地递增,因此它将继续比较120和50,然后继续切换这些值。

对于i=0,您找到最大的元素(除了最后一个元素,因为dec2开始,而不是1)并将其放在第0个位置。

然后,对于i=1,您找到最大的元素(同样是所有元素中,除了最后一个元素,它包括第一个元素)并将其放在第一个位置。

等等

你不能这样排序——当然,最大的元素会在最后结束(根据你对另一个答案的评论,这不是你想要的),但是没有什么能确保任何其他元素都被排序。

如果你想让它从大到小排序,在你的内循环中,你需要在到达i时停止,所以你只选择剩余元素中最大的元素。

这与选择排序非常相似,因此您可以查看更多信息或优化(例如跟踪最大值并在最后交换,而不是在我们找到的每个更大的元素上交换)。

为什么不把while循环改成for循环呢?例如:

for (int dec=2; (jk[0]-dec+1) > 1; dec++)
{
    if (room[i].max_students > room[jk[0] - dec].max_students)
    {            
        TEMPbuilding_code = room[i].building_code;
        room[i].building_code = room[jk[0] - dec].building_code;
        room[jk[0] - dec].building_code = TEMPbuilding_code;
        TEMProom_number = room[i].room_number;
        room[i].room_number = room[jk[0] - dec].room_number;
        room[jk[0] - dec].room_number = TEMProom_number;
        TEMPmax_students = room[i].max_students;
        room[i].max_students = room[jk[0] - dec].max_students;
        room[jk[0] - dec].max_students = TEMPmax_students;
    }
}

还有,你在while循环中的操作顺序搞砸了吗?我想应该是jk[0] + 1 - dec还是jk[0] - dec + 1 ?