Arranjo compacto de DIVs em duas direções

É fácil organizar DIVs horizontalmente com float. Por exemplo

<div style="width: 500px;">
 <div style="float:left; width: 200px; height: 100px; background-color:Yellow;"></div>
 <div style="float:left; width: 150px; height: 60px; background-color:Blue;"></div>
 <div style="float:left; width: 140px; height: 240px; background-color:Green;"></div>
 <div style="float:left; width: 180px; height: 200px; background-color:Red;"></div>
 <div style="float:left; width: 130px; height: 160px; background-color:Purple;"></div>
</div>

Isso produzirá:

Mas como organizar os DIVs horizontal e verticalmente? Nesse caso, como deslocar os DIVs vermelho e roxo para cima, onde houver espaço vazio (em DIVs amarelo e azul)?

NOTA Este é apenas um exemplo, e desejo encontrar um método para fazer o arranjo para qualquer conjunto de DIVs (não apenas este exemplo típico

questionAnswers(5)

yourAnswerToTheQuestion