我正在使用选择排序对板球队的名单进行排序。
首先重复一个名称 3 次后,排序就会起作用,这会从我正在排序的数组中消除其他两个名称。
从数组输入(按顺序):
克拉克·沃森·比尔·科普兰·哈丁·哈里斯·休斯·赫西·约翰逊·卡瓦贾·里昂·马什·帕丁森·庞廷·西德尔·华纳
数组排序后的输出:
啤酒啤酒啤酒科普兰哈丁哈里斯休斯赫西约翰逊卡瓦贾里昂马什帕丁森庞廷
代码:
void sort_names (Team_t player[]) {
int pos;
int min;
int i, str_check;
char *temp = NULL;
for (pos = 0; pos < MAX_PLYR; pos++) {
min = pos;
for (i = (pos + 1); i < MAX_PLYR; i++) {
str_check = strcmp(player[i].pname, player[min].pname);
if (str_check < 0) {
min = i;
}
}
if (min != pos) {
temp = player[pos].pname;
strcpy(player[pos].pname, player[min].pname);
strcpy(player[min].pname, temp);
}
}
}
最佳答案
您的这部分代码将无法正确交换条目:
temp = player[pos].pname;
strcpy(player[pos].pname, player[min].pname);
strcpy(player[min].pname, temp);
第一行将指向“pos”玩家姓名的指针保存到temp
- 而不是名称本身。然后第一个 strcpy 覆盖它 - 它丢失了。 (第二个 strcpy 只是将相同的字符串复制回原来的位置。)这就是为什么您会看到首先排序的项目多次出现的原因。
关于c - 选择排序逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7792529/