entrada: array: arreglo de n puntos; n: tamaƱo del arreglo salida: los dos puntos mas cercanos con su distancia funcion divide_and_conquer_run(puntos_x, nx, puntos_y, ny) si nx <= 4 then par_mas_cerca2 = brute_force(puntos_x, nx, d) par_mas_cerca[0] = par_mas_cerca2[0] par_mas_cerca[1] = par_mas_cerca2[1] return d fin si medio = puntos_x[nx / 2].x; izquerda = -1 derecha = ny para i = 0 mientras que i < ny hacer si puntos_y[i].x < medio entonces puntos_y2[++izquerda] = puntos_y[i] sino puntos_y2[--derecha] = puntos_y[i] fin si fin para para i = ny - 1 mientras que derecha < i hacer par_mas_cerca2[0] = puntos_y2[derecha] puntos_y2[derecha] = puntos_y2[i] puntos_y2[i] = par_mas_cerca2[0] fin para min_d = divide_and_conquer_run(puntos_x, nx / 2, puntos_y2, izquerda + 1) d = divide_and_conquer_run(puntos_x + nx / 2, nx - nx / 2, puntos_y2 + izquerda + 1, ny - izquerda - 1) si d < min_d entonces min_d = d par_mas_cerca[0] = par_mas_cerca2[0] par_mas_cerca[1] = par_mas_cerca2[1] fin si d = sqrt(min_d) izquerda = -1 derecha = ny para i = 0 mientras que i < ny hacer x = puntos_y[i].x - medio si x <= -d o x >= d entonces continuar fin si si x < 0 entonces puntos_y2[++izquerda] = puntos_y[i] sino puntos_y2[--derecha] = puntos_y[i] fin si fin para mientras que izquerda >= 0 hacer x0 = puntos_y2[izquerda].y + d mientras que derecha < ny y puntos_y2[derecha].y > x0 hacer derecha = dercha + 1 fin mientras si derecha >= ny entonces romper fin si x1 = puntos_y2[izquerda].y - d para i = derecha mientras que i < ny y puntos_y2[i].y > x1 hacer si distance(puntos_y2[izquerda], puntos_y2[i])) < min_d entonces min_d = x par_mas_cerca[0] = puntos_y2[izquerda] par_mas_cerca[1] = puntos_y2[i] fin si fin para izquerda = izquerda - 1 fin mientras return min_d fin funcion funcion divide_and_conquer(puntos, n) puntos_x = puntos puntos_y = puntos sort(puntos_x, n) sort(puntos_y, n) distancia_minimo y par_mas_cerca = divide_and_conquer_run(puntos_x, n, puntos_y, n) return par_mas_cerca y distancia_minimo fin funcion