2017-02-21 145 views
0

我是一个相当新的编码器。我想了解以下Ç代码:如何将qsort从C转换为Java?

int compar (const void *a, const void *b) 
{ 
    return ((int *) a)[0] - ((int *) b)[0]; 
} 

被用于:

qsort (&tree[0][0], 8, 3 * sizeof (int), &compar); 

树是一个二维数组,这是专门为这种情况下,8×(它被填满可能的举措,但我认为这对于学习这个目的是无关紧要的)。我理解qsort的前三个参数(尽管第一个调用地址的原因有点不确定,但我认为这就是C调用数组的原因),但不是第四个参数。我不明白qsort如何使用compar。我想设计一个与上述qsort相同的排序方法,虽然我并不真正关心它本身是快速排序的(因为我可以自由地利用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代码不必使用泛型或任何东西,事实上,代码越简单越好。任何帮助将不胜感激,如果你愿意,请解释代码?谢谢

+0

它返回'a'和'b'之间的差异。 '((int *)a)''将'a'转换为一个int指针,数组语法'[0]'是取消引用该指针来获得一个int。它可以被重写为*((int *)a);' –

+0

我得到a和b将是第一列元素,但我不明白它的实现。其他两列如何改变? – user7413060

+1

发布您迄今为止编写的Java代码。 –

回答

0

原来,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); 
    } 
    }); 
}