$q = mysql_query("запрос");
$images = array();
while($data = mysql_fetch_array($q))
{
$images[$data['id']] = $data['height'];
}
$variants = array();
for($i=0; $i<10; $i++)
{
$shuffle = shuffle($images);
$a1 = array_sum(array_slice($shuffle, 0, 5));
$a2 = array_sum(array_slice($shuffle, 5, 5));
$a3 = array_sum(array_slice($shuffle, -5));
$variants[max($a1, $a2, $a3)-min($a1, $a2, $a3)] = $shuffle;
}
ksort($variants);
$best_array = array_shift($variants);
$a1 = array_slice($best_array, 0, 5); // тут будет массив для 1 столбца
$a2 = array_slice($best_array, 5, 5); // тут будет массив для 2 столбца
$a3 = array_slice($best_array, -5); // тут будет массив для 3 столбца
Меняя 10 в цикле for можно менять точность разброса высот, тем больше число, тем точнее, но больше времени потребуется.
Вариант экспериментальный, ну а вдруг подойдет. Отпишитесь пожалуйста, как попробуете данный вариант, очень интересно, что из этого выйдет.