2017-02-21 65 views
0

Я довольно новый кодер. Я пытаюсь понять следующее C код:Как перевести 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); 

дерево является 2D массив, это специально 8x3 для этого случая (он наполняется возможные шаги, но я думаю, что это не имеет значения для изучения этого). Я понимаю первые три параметра qsort (хотя и немного, что почему первый вызывает адрес, но я думаю, что именно так C вызывает массив), но не четвертый. Я не понимаю, как qsort использует сравнение. Я хочу разработать метод сортировки Java, который выполняет те же действия, что и вышеупомянутый qsort, хотя мне не важно, чтобы он был быстрым, как таковой (так как я могу свободно использовать любую предлагаемую Java-версию, t должен быть быстрым. Поскольку это не назначение, я просто хочу метод сортировки, который может сортироваться быстро, поэтому 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)' casts '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); 
    } 
    }); 
}