我是一个相当新的编码员。我试图理解以下 C 代码:
int compar (const void *a, const void *b)
{
return ((int *) a)[0] - ((int *) b)[0];
}
用于:
qsort (&tree[0][0], 8, 3 * sizeof (int), &compar);
树是一个 2D 数组,在本例中是一个 8x3 的数组(它充满了可能的移动,但我认为这与学习这个的目的无关)。我理解 qsort 的前三个参数(虽然对于为什么第一个参数调用地址有点不确定,但我认为这就是 C 调用数组的方式),但不理解第四个参数。我不明白 qsort 如何使用比较。我想设计一个与前面提到的 qsort 相同的 Java 排序方法,尽管我并不真正关心它本身是快速排序(因为我可以自由地利用任何 Java 可能的东西)提供,它不一定是快速排序。因为这不是一个作业,我只想要一个可以快速排序的排序方法,因此 nlogn 或其他东西会很有帮助,因为这个项目涉及大量递归并调用它很多时间)。我正在努力理解比较正在做什么以及 qsort 如何利用它来排序。
unorderStart
0 -2 1
0 -1 2
5 1 2
5 2 1
0 2 -1
0 1 -2
0 -1 -2
0 -2 -1
unorderEnd
orderStart
0 -2 1
0 -1 2
0 2 -1
0 1 -2
0 -1 -2
0 -2 -1
5 1 2
5 2 1
orderEnd
unorderStart
0 -1 3
1 0 4
3 2 4
3 3 3
3 3 1
3 2 0
0 0 0
0 -1 1
unorderEnd
orderStart
0 -1 3
0 0 0
0 -1 1
1 0 4
3 2 4
3 3 3
3 3 1
3 2 0
orderEnd
unorderStart
0 -2 5
0 -1 6
0 1 6
0 2 5
5 2 3
0 1 2
0 -1 2
0 -2 3
unorderEnd
orderStart
0 -2 5
0 -1 6
0 1 6
0 2 5
0 1 2
0 -1 2
0 -2 3
5 2 3
orderEnd
unorderStart
0 0 4
0 1 5
0 3 5
1 4 4
3 4 2
2 3 1
3 1 1
3 0 2
unorderEnd
orderStart
0 0 4
0 1 5
0 3 5
1 4 4
2 3 1
3 4 2
3 1 1
3 0 2
orderEnd
unorderStart
0 2 5
0 3 6
0 5 6
0 6 5
0 6 3
0 5 2
5 3 2
0 2 3
unorderEnd
orderStart
0 2 5
0 3 6
0 5 6
0 6 5
0 6 3
0 5 2
0 2 3
5 3 2
orderEnd
unorderStart
3 1 3
2 2 4
0 4 4
0 5 3
0 5 1
1 4 0
2 2 0
2 1 1
unorderEnd
orderStart
0 4 4
0 5 3
0 5 1
1 4 0
2 2 4
2 2 0
2 1 1
3 1 3
orderEnd
unorderStart
4 2 1
0 3 2
0 5 2
0 6 1
0 6 -1
0 5 -2
0 3 -2
0 2 -1
unorderEnd
orderStart
0 3 2
0 5 2
0 6 1
0 6 -1
0 5 -2
0 3 -2
0 2 -1
4 2 1
orderEnd
unorderStart
2 0 2
2 1 3
2 3 3
2 4 2
0 4 0
0 3 -1
0 1 -1
0 0 0
unorderEnd
orderStart
0 4 0
0 3 -1
0 1 -1
0 0 0
2 0 2
2 1 3
2 3 3
2 4 2
orderEnd
unorderStart
0 -2 3
0 -1 4
2 1 4
0 2 3
0 2 1
2 1 0
0 -1 0
0 -2 1
unorderEnd
orderStart
0 -2 3
0 -1 4
0 2 3
0 2 1
0 -1 0
0 -2 1
2 1 4
2 1 0
orderEnd
unorderStart
0 -1 5
0 0 6
0 2 6
0 3 5
1 3 3
7 2 2
0 0 2
0 -1 3
unorderEnd
orderStart
0 -1 5
0 0 6
0 2 6
0 3 5
0 0 2
0 -1 3
1 3 3
7 2 2
orderEnd
unorderStart
0 1 4
0 2 5
0 4 5
0 5 4
0 5 2
2 4 1
0 2 1
0 1 2
unorderEnd
orderStart
0 1 4
0 2 5
0 4 5
0 5 4
0 5 2
0 2 1
0 1 2
2 4 1
orderEnd
unorderStart
6 2 2
0 3 3
0 5 3
0 6 2
0 6 0
0 5 -1
0 3 -1
1 2 0
unorderEnd
orderStart
0 3 3
0 5 3
0 6 2
0 6 0
0 5 -1
0 3 -1
1 2 0
6 2 2
orderEnd
unorderStart
2 0 1
0 1 2
0 3 2
0 4 1
0 4 -1
0 3 -2
0 1 -2
0 0 -1
unorderEnd
orderStart
0 1 2
0 3 2
0 4 1
0 4 -1
0 3 -2
0 1 -2
0 0 -1
2 0 1
orderEnd
unorderStart
0 -2 2
0 -1 3
1 1 3
5 2 2
0 2 0
0 1 -1
0 -1 -1
0 -2 0
unorderEnd
orderStart
0 -2 2
0 -1 3
0 2 0
0 1 -1
0 -1 -1
0 -2 0
1 1 3
5 2 2
orderEnd
unorderStart
0 -1 4
0 0 5
0 2 5
2 3 4
0 3 2
0 2 1
0 0 1
0 -1 2
unorderEnd
orderStart
0 -1 4
0 0 5
0 2 5
0 3 2
0 2 1
0 0 1
0 -1 2
2 3 4
orderEnd
unorderStart
0 1 5
0 2 6
0 4 6
0 5 5
0 5 3
1 4 2
4 2 2
0 1 3
unorderEnd
orderStart
0 1 5
0 2 6
0 4 6
0 5 5
0 5 3
0 1 3
1 4 2
4 2 2
orderEnd
unorderStart
0 2 3
0 3 4
0 5 4
0 6 3
0 6 1
0 5 0
2 3 0
0 2 1
unorderEnd
orderStart
0 2 3
0 3 4
0 5 4
0 6 3
0 6 1
0 5 0
0 2 1
2 3 0
orderEnd
unorderStart
1 1 1
3 2 2
0 4 2
0 5 1
0 5 -1
0 4 -2
0 2 -2
0 1 -1
unorderEnd
orderStart
0 4 2
0 5 1
0 5 -1
0 4 -2
0 2 -2
0 1 -1
1 1 1
3 2 2
orderEnd
unorderStart
0 -1 2
2 0 3
0 2 3
0 3 2
0 3 0
0 2 -1
0 0 -1
0 -1 0
unorderEnd
orderStart
0 -1 2
0 2 3
0 3 2
0 3 0
0 2 -1
0 0 -1
0 -1 0
2 0 3
orderEnd
unorderStart
0 -2 4
0 -1 5
0 1 5
1 2 4
2 2 2
0 1 1
0 -1 1
0 -2 2
unorderEnd
orderStart
0 -2 4
0 -1 5
0 1 5
0 1 1
0 -1 1
0 -2 2
1 2 4
2 2 2
orderEnd
unorderStart
0 0 5
0 1 6
0 3 6
0 4 5
2 4 3
0 3 2
0 1 2
0 0 3
unorderEnd
orderStart
0 0 5
0 1 6
0 3 6
0 4 5
0 3 2
0 1 2
0 0 3
2 4 3
orderEnd
unorderStart
0 2 4
0 3 5
0 5 5
0 6 4
0 6 2
0 5 1
1 3 1
1 2 2
unorderEnd
orderStart
0 2 4
0 3 5
0 5 5
0 6 4
0 6 2
0 5 1
1 3 1
1 2 2
orderEnd
unorderStart
0 1 2
0 2 3
0 4 3
0 5 2
0 5 0
0 4 -1
0 2 -1
1 1 0
unorderEnd
orderStart
0 1 2
0 2 3
0 4 3
0 5 2
0 5 0
0 4 -1
0 2 -1
1 1 0
orderEnd
unorderStart
0 -1 1
0 0 2
0 2 2
0 3 1
0 3 -1
0 2 -2
0 0 -2
0 -1 -1
unorderEnd
orderStart
0 -1 1
0 0 2
0 2 2
0 3 1
0 3 -1
0 2 -2
0 0 -2
0 -1 -1
orderEnd
我认为第一列是按降序排序的,但是其他两列发生了什么?行? Java 代码不必使用泛型或任何东西,事实上,代码越简单越好。任何帮助将不胜感激,如果愿意,请解释一下代码?谢谢
最佳答案
事实证明,Arrays.sort 可以使用编码器可以自定义的比较器。请注意,这基本上是我根据大部分评论(至少试图帮助我理解的所有内容)制作的最终产品。非常感谢!
public static void reorder(int[][] a){
Arrays.sort(a, new Comparator<int[]>() {
@Override
public int compare(final int[] a, final int[] b) {
Integer c = Integer.valueOf(a[0]);
Integer d = Integer.valueOf(b[0]);
return c.compareTo(d);
}
});
}
关于java - 如何将 qsort 从 C 语言转换为 Java 语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42362776/