@Override public void merge(int i, int j) { float nij = n[i] + n[j]; for (int k = 0; k < i; k++) { proximity[index(i, k)] = (d(i, k) * (n[i] + n[k]) + d(j, k) * (n[j] + n[k]) - d(j, i) * n[k]) / (nij + n[k]); } for (int k = i+1; k < j; k++) { proximity[index(k, i)] = (d(k, i) * (n[i] + n[k]) + d(j, k) * (n[j] + n[k]) - d(j, i) * n[k]) / (nij + n[k]); } for (int k = j+1; k < size; k++) { proximity[index(k, i)] = (d(k, i) * (n[i] + n[k]) + d(k, j) * (n[j] + n[k]) - d(j, i) * n[k]) / (nij + n[k]); } n[i] += n[j]; } }