首页 > 解决方案 > 迭代中的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,但我不太确定如何在我的示例中正确使用它。

有什么建议么?

标签: c

解决方案


所以我自己找到了一个解决方案,我只想分享它,以防其他人遇到这个问题。

我所做的是我在我的城市结构中添加了一个距离整数。我指定了从街道到城市的距离。如果没有匹配的街道,则距离将设置为 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;
}

推荐阅读