Если достоверность переданных указателей проверяется внутри функции сравнения, эти проверки выполняются каждый раз, когда эта функция выполняется во время сортировки.Любой указатель может быть проверен несколько раз для одного и того же условия.
Если вместо этого массив «санирован» перед сортировкой, перемещая все значения NULL в конце:
size_t remove_nulls(CAR **cars, size_t n)
{
// Find the first NULL (thanks again, @chqrlie)
size_t count = 0;
while(count < n && cars[count])
{
++count;
}
// Move the elements to 'fill' the blanks
for (size_t i = count; i < n; ++i)
{
if ( cars[i] )
{
cars[count] = cars[i];
++count;
}
}
// The last pointers must be overwritten
for (size_t i = count; i < n; ++i)
cars[i] = NULL;
// Returns the number of valid pointers
return count;
}
Затем, как chqrlie отметил, что вы можете удалить пустые проверки из функции сравнения и отсортировать только действительные указатели.