Ordenar una matriz de acuerdo con los elementos de otra matriz

Tengo una serie de identificaciones

a1 = [1, 2, 3, 4, 5]  

y tengo otra matriz de objetos con identificadores en orden aleatorio

a2 = [(obj_with_id_5), (obj_with_id_2), (obj_with_id_1), (obj_with_id_3), (obj_with_id_4)]  

Ahora necesito ordenar a2 según el orden de los identificadores en a1. Entonces a2 debería convertirse ahora en:

[(obj_with_id_1), (id_2), (id_3), (id_4), (id_5)]  

a1 puede ser [3, 2, 5, 4, 1] o en cualquier orden, pero a2 debe corresponder al orden de los identificadores en a1.

Me gusta esto:

a1.each_with_index do |id, idx|
  found_idx = a1.find_index { |c| c.id == id }
  replace_elem = a2[found_idx]
  a2[found_idx] = a2[idx]
  a2[idx] = replace_elem
end  

Pero esto todavía podría funcionar en un tiempo O (n ^ 2) si el orden de los elementos de a2 es exactamente el inverso de a1. ¿Alguien puede decirme la forma más eficiente de clasificar a2?

Respuestas a la pregunta(4)

Su respuesta a la pregunta