c - 迭代中的Qsort?
问题描述
我在 C 中有一个类似的迭代:
if (streetList->street[y]->cityStart == s->cityId &&
streetList->street[y]->cityEnd == sl->city[z]->cityId ||
streetList->street[y]->cityEnd == s->cityId &&
streetList->street[y]->cityStart == sl->city[z]->cityId) {
printf("%d %s\n", streetList->street[y]->distance, sl->city[z]->name);
}
这两个列表都来自我自动读取的两个不同的 .dat 文件。
上面的代码打印出 CityName 及其与用户设置的城市的距离。这一切都很好。
但是,我想按距离(整数)快速对该输出进行排序。有没有办法在迭代中的 C 中做到这一点?例如,我想对该输出进行排序,以便在迭代中首先获得与给定城市距离最短的城市。
例如:
350, New York
200, Miami
应该成为
200 Miami
350 New York
我读过关于qsort
,但我不太确定如何在我的示例中正确使用它。
有什么建议么?
解决方案
所以我自己找到了一个解决方案,我只想分享它,以防其他人遇到这个问题。
我所做的是我在我的城市结构中添加了一个距离整数。我指定了从街道到城市的距离。如果没有匹配的街道,则距离将设置为 0。
if (streetList->street[y]->cityStart == s->cityId &&
streetList->street[y]->cityEnd == sl->city[z]->cityId ||
streetList->street[y]->cityEnd == s->cityId &&
streetList->street[y]->cityStart == sl->city[z]->cityId) {
printf("%d %s\n", streetList->street[y]->distance, sl->city[z]->name);
sl->city[z]->distance = streetList->street[y]->distance;
}
现在,可以在迭代之外使用 qsort :
qsort(sl->city, sl->count, sizeof(City *), &citySort);
请记住,&citySort 是排序算法。这需要根据您要排序的内容单独定义。就我而言:
int citySort(const void *a, const void *b)
{
City *ba = *(City **)a;
City *bb = *(City **)b;
if (ba->distance > bb->distance)
return +1;
else if (ba->distance < bb->distance)
return -1;
else
return 0;
}
推荐阅读
- assembly - 如何将数字转换为 ASCII
- c# - 我不能使用 ajax 调用 api 但邮递员调用没问题
- tensorflow - TensorFlow Object-Detection Fine-Tuning 导致不正确的准确度值
- firebase - 当我想从 firebase 打印数据时,构建器会重复多次
- c# - 如何在 .NET Core 2.2 中为 SignalR 配置 JsonOptions?
- reactjs - 反应生产模式
- html - 如何将 div 包裹在图像周围,以响应更大和更小的 PC 屏幕尺寸
- regex - .htaccess 使用 GET 参数和 URL 条件重定向
- python - Matplotlib 的 Spy、Imshow 和 Matshow 的问题
- spring-boot - 提高查询执行时间