2017-02-21 117 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); 
    } 
    }); 
}