如何关联排行榜的姓名与分数数组,排序时保持对应关系
解决排行榜姓名与分数关联排序的问题
核心思路
把原本分开存储的姓名和分数绑定成一个整体(比如结构体、类或自定义对象),排序时直接对这个整体进行比较和交换,就能从根源上保证姓名与分数始终对应,不会出现错位。
具体实现步骤
1. 重构数据存储结构
替换独立的字符串数组和整数数组,改用存储"用户-分数"实体的集合:
- C语言示例(结构体):
typedef struct { char name[50]; int score; } Player; Player leaderboard[10]; // 假设排行榜最多容纳10人
- Java示例(自定义类):
class Player { String name; int score; public Player(String name, int score) { this.name = name; this.score = score; } } List<Player> leaderboard = new ArrayList<>();
- Python示例(自定义类):
class Player: def __init__(self, name, score): self.name = name self.score = score leaderboard = []
2. 修改冒泡排序逻辑
排序时以Player实体的score字段为依据,交换整个实体对象,确保姓名与分数同步移动。以Python的降序排序为例:
def bubble_sort_leaderboard(leaderboard): n = len(leaderboard) for i in range(n): swapped = False for j in range(0, n-i-1): # 按分数从高到低排序,升序则改为 < if leaderboard[j].score < leaderboard[j+1].score: leaderboard[j], leaderboard[j+1] = leaderboard[j+1], leaderboard[j] swapped = True if not swapped: break
3. 更新分数替换逻辑
游戏结束后,判断新分数是否有资格进入排行榜,替换后重新排序(或优化排序逻辑):
new_player_name = "玩家昵称" new_player_score = 92 # 假设排行榜最多10人 if len(leaderboard) < 10: leaderboard.append(Player(new_player_name, new_player_score)) bubble_sort_leaderboard(leaderboard) else: # 对比当前排行榜最低分(最后一名) if new_player_score > leaderboard[-1].score: leaderboard[-1] = Player(new_player_name, new_player_score) bubble_sort_leaderboard(leaderboard)
优化建议
- 冒泡排序效率偏低,若排行榜人数较多,可替换为选择排序或插入排序;如果仅替换最后一名,还可以只从最后一名的位置向前冒泡,减少不必要的比较:
def bubble_up_from_last(leaderboard): j = len(leaderboard) - 1 while j > 0 and leaderboard[j].score > leaderboard[j-1].score: leaderboard[j], leaderboard[j-1] = leaderboard[j-1], leaderboard[j] j -= 1
替换最后一名后调用这个函数,比全量排序效率更高。
内容的提问来源于stack exchange,提问作者newTy
相关产品推荐
相关产品推荐

