【发布时间】:2017-02-04 14:37:34
【问题描述】:
假设我有以下结构:
struct Pair {
int x;
int y;
}
我想按对中的第一个元素(即 x)对数组进行排序,然后按第二个元素对数组进行排序,因此如果我们得到以下内容:
input: [(1,2), (1,0), (2,3), (1,4), (2,2)]
output: [(1,0), (1,2), (1,4), (2,2), (2,3)]
现在我有两个函数,其中一个按第一个元素对数组进行排序,第二个按第二个元素对数组进行排序,但效率较低。如何遍历数组一次并达到预期的结果?
void sort1(Pair ps[], int size) {
int i, j;
for (i = 0; i < size; i++) {
for (j = i + 1; j < size; j++) {
if (ps[j].x > ps[j+1].x) {
Pair temp = ps[j+1];
ps[j+1] = ps[j];
ps[j] = temp;
}
}
}
}
void sort2(Pair ps[], int size) {
int i, j;
for (i = 0; i < size; i++) {
for (j = i + 1; j < size; j++) {
if (ps[j].y > ps[j+1].y) {
Pair temp = ps[j+1];
ps[j+1] = ps[j];
ps[j] = temp;
}
}
}
}
另外,有没有一种使用内置排序功能的快速方法?
【问题讨论】:
-
但是c中有内置函数吗?在 C++ 中这是可能的。
-
这个问题没有显示任何研究工作。
-
对我来说,您的排序功能不是快速排序,即使您只有单个值要排序,也不会正确排序。但要解决先排序 x 和后排序 y 的问题,您需要添加 "else if(ps[j]x == ps[j+1].x) { if (ps[j].y > ps[j+ 1].y { Pair temp = ps[j+1]; ps[j+1] = ps[j]; ps[j] = temp;}}. 除非你想学习如何实现快速排序算法,c stdlib 中已经有一个快速排序函数。输入 man qsort。
-
@Shiping 您提议的
else if正文与现有的if正文相同,因此您不需要else;你可以合并条件。qsort使用未指定的排序算法;它不必是快速排序。 OP 的代码是冒泡排序。 -
冒泡排序虽然稳定,但是太慢了。特别是因为您使用了两个排序功能。
标签: c arrays sorting struct lexicographic