关于CS50课程Tideman问题中sort_pairs函数的理解困惑
关于CS50 Tideman问题sort_pairs函数的疑惑解答
首先得明确几个核心数据结构的作用,这是理解问题的关键:
preferences[i][j]:存储的是候选人i比候选人j更受选民欢迎的人数pairs数组:只保存有明确胜负的候选人对(排除平局情况),每个元素是pair结构体,记录了该对决中胜者(winner)和败者(loser)的候选人索引sort_pairs的目标:把pairs数组中的所有胜负对,按胜利强度从高到低排序,胜利强度就是该对决中胜者比败者受欢迎的人数,也就是preferences[胜者索引][败者索引]
为什么不能用preferences[i][j]?
你混淆了循环变量的含义:
- sort_pairs里的
i和j是遍历pairs数组的下标,不是候选人的索引!比如i从pair_count-1开始,pair_count是有效胜负对的数量(比如3个候选人最多有3个胜负对,若有平局则更少),和候选人数量candidate_count完全是两个概念。 - 如果强行用
preferences[i][j],这里的i、j是pairs数组的位置序号,根本对应不上preferences里的候选人比较数据,完全是错误的关联。
正确逻辑是什么?
要排序pairs数组里的元素,就得拿每个胜负对自己的胜利强度来比较:
- 取
pairs[j]这个胜负对,它的胜者是pairs[j].winner,败者是pairs[j].loser - 这个对决的胜利强度就是
preferences[pairs[j].winner][pairs[j].loser](胜者比败者受欢迎的人数) - 同理,
pairs[j+1]的胜利强度是preferences[pairs[j+1].winner][pairs[j+1].loser] - 比较这两个强度,把强度高的胜负对放在前面,这样就完成了降序排序
另外,你的sort_pairs函数还有一个语法错误:外层循环的条件写成了i <= 0,这会导致循环根本不会执行,应该改成i >= 0。
内容的提问来源于stack exchange,提问作者Charlie Webster
相关产品推荐
相关产品推荐

