De lo que se trata es de crear un array con las posiciones de los diferentes elementos y, durante el evento onmousemove, verificar si el elemento arrastrado ocupa alguna de esas posiciones (colisiona). Si eso se cumple, los elementos se mueven dejándole el espacio en blanco (y se actualiza el array de posiciones). Al mismo tiempo, hay que controlar, durante los eventos onmouseout y onmouseup si existe algún espacio en blanco que ocupar (si no existe, el espacio será la última posición normal del elemento arrastrable), y se posiciona el elemento arrastrable en ese espacio. Aquí hay un buen ejemplo de eso:
http://www.formatoweb.com.ar/blog/files/dragdrop2.php