/* call-seq: Function.joint_sort(x,y) Sorts +x+, while ensuring that the corresponding +y+ values keep matching. Should be pretty fast, as it is derived from glibc's quicksort. a = Dvector[3,2,1] b = a * 2 -> [6,4,2] Function.joint_sort(a,b) -> [[1,2,3], [2,4,6]] */ static VALUE function_joint_sort(VALUE self, VALUE x, VALUE y) { long x_len, y_len; double * x_values = Dvector_Data_for_Write(x, &x_len); double * y_values = Dvector_Data_for_Write(y, &y_len); if(x_len != y_len) rb_raise(rb_eArgError,"both vectors must have the same size"); else { /* we temporarily freeze both Dvectors before sorting */ FL_SET(x, DVEC_TMPLOCK); FL_SET(y, DVEC_TMPLOCK); joint_quicksort(x_values, y_values, (size_t) x_len); /* and unfreeze them */ FL_UNSET(x, DVEC_TMPLOCK); FL_UNSET(y, DVEC_TMPLOCK); } /* we return the array of both Dvectors */ return rb_ary_new3(2,x,y); }