Если вам нужно отсортировать только одно поле, тогда usort
- хороший выбор. Однако решение быстро становится беспорядочным, если вам нужно сортировать по нескольким полям. В этом случае можно использовать библиотеку YaLinqo *, которая реализует синтаксис SQL-подобных запросов для массивов и объектов. Он имеет довольно синтаксис для всех случаев:
$sortedByName = from($objects)->orderBy('$v->name');
$sortedByCount = from($objects)->orderBy('$v->count');
$sortedByCountAndName = from($objects)->orderBy('$v->count')->thenBy('$v->name');
Здесь '$v->count'
является сокращением для function ($v) { return $v->count; }
(либо можно использовать). Эти цепочки методов возвращают итераторы, но вы можете получить массивы, добавив ->toArray()
в конце, если вам это нужно.
*, разработанный мной
Вы не перераспределяете достаточно памяти:
array = (int*) realloc (array, lastIndex * sizeof(int));
На первой итерации цикла значение lastIndex
увеличивается с 0 до 1, затем вы запускаете вышеуказанный вызов realloc
. Поскольку lastIndex
равно 1, у вас все еще достаточно места для 1 элемента. В результате вы пишете после окончания выделенной памяти на следующей итерации.
Это вызывает неопределенное поведение , которое в вашем случае проявляется в том, что оно работает должным образом в течение первых 6 итераций и заканчивается 7-м. Он мог так же легко разбиться на первой или второй итерации.
Добавьте единицу к размеру, который вы выделяете:
array = realloc(array, (lastIndex + 1) * sizeof(int));
Кроме того, не приводят возвращаемое значение malloc
/ realloc
.
Исправьте realloc
:
array = (int*) realloc (array, (lastIndex + 1) * sizeof(int))
Вы выделяете на один предмет меньше, чем нужно.