| * Routines for selecting the k largest or smallest values could use |
| heapsort for speed O(N log k) rather than insertion O(N k). |
| |
| * Sorting of complex arrarys without using additional memory. We try |
| to avoid allocating memory internally in GSL, so internally computing |
| the magnitudes and storing them in a temporary array is undesirable. |
| |
| Obviously a complex array can be sorted using sqrt(x*x + y*y) <=> |
| sqrt(u*u + v*v) (written in a numerically stable way) for every |
| comparison, but this may be unacceptably slow. Maybe not? It is just a |
| constant factor. The square roots could sometimes be avoided by |
| optimization, |
| |
| (x,y) = (MAX(|x|,|y|), MIN(|x|,|y|)) |
| (u,v) = (MAX(|u|,|v|), MIN(|u|,|v|)) |
| |
| if (x < u/sqrt(2)) /* This part is optional optimization */ |
| return -1 |
| if (x > u*sqrt(2)) |
| return +1 |
| |
| if (x == 0 && u == 0) ... |
| if (x == 0) ... |
| if (u == 0) ... |
| |
| t = u*sqrt((1+(v/u)^2)/(1+(y/x)^2)) |
| |
| if (x < t) |
| return -1 |
| if (x > t) |
| return +1 |
| else |
| return 0 |
| |
| but this does depend on the data having sufficient range for the |
| optimization to be worthwhile, otherwise it is an extra cost. |