void SortLines(long *lin, long N, double **d) { if (N <= 2) return; /* Find a diametral pair of points, put it in lin[0], lin[1]: */ { long i, j, iMax, jMax, k; double dMax = 0; for (i=0; i dMax) { dMax = dd; iMax = i; jMax = j; } } k = lin[0]; lin[0] = lin[iMax]; lin[iMax] = k; k = lin[1]; lin[1] = lin[jMax]; lin[jMax] = k; } /* Now insert all other points along the path: */ { long i, r; r = 0; for (i=2; i=N-i) { r -= N-i; } /* Bring "lin[i+r]" to "lin[i]": */ if (r!=0) { long k = lin[i+r]; lin[i+r] = lin[i]; lin[i] = k; } /* Insert "lin[i]" in the path "lin[0..i-1]". */ /* Find the pair "lin[jMin-1], lin[jMin]" such that */ /* inserting "lin[i]" between them will do least damage: */ ki = lin[i]; kb = lin[0]; db = d[ki][kb]; /* Consider inserting "lin[i]" before "lin[0]": */ cMin = db; jMin = 0; for (j=1; jjMin; j--) { lin[j] = lin[j-1]; } lin[jMin] = ki; } } } }