theTavis
12-15-2010, 02:08 AM
Hi,
I am trying to optimize a function using qsort to sort a very large array of Point3 world coordinates. I found it was faster to precompute the values and store them in a parallel array with a for-collect loop. My question is: using qsort, how do I reference these values to sort the Point3 array directly? My current work-around requires two additional for-collect loops as in this example:
valueArr = #() -- declare here so it can be seen by functions
fn sortFn a b = if valueArr[a] > valueArr[b] then 1 else -1
fn sortPoints pointArr =
(
indexArr = for i = 1 to pointArr.count collect i -- collect the indices, these are what we sort
valueArr = for p in pointArr collect (cos p.x + sin p.y) -- compute a value to sort by
qsort indexArr sortFn -- sort the indices
for i = 1 to pointArr.count collect pointArr[indexArr[i]] -- return the points sorted by index
)
This works fine, but for large point counts it would be faster without the first and last for-collect loops. Is it possible to do something like this:
valueArr = #() -- declare here so it can be seen by functions
-- here's the part I don't know how to do: getting the index of a or b
fn sortFn a b = if valueArr[(index of a)] > valueArr[(index of b)] then 1 else -1
fn sortPoints pointArr =
(
valueArr = for p in pArr collect (cos p.x + sin p.y) -- compute some value to sort by
qsort pointArr sortFn -- sort the actual point array
)
any help is appreciated. Thanks!
I am trying to optimize a function using qsort to sort a very large array of Point3 world coordinates. I found it was faster to precompute the values and store them in a parallel array with a for-collect loop. My question is: using qsort, how do I reference these values to sort the Point3 array directly? My current work-around requires two additional for-collect loops as in this example:
valueArr = #() -- declare here so it can be seen by functions
fn sortFn a b = if valueArr[a] > valueArr[b] then 1 else -1
fn sortPoints pointArr =
(
indexArr = for i = 1 to pointArr.count collect i -- collect the indices, these are what we sort
valueArr = for p in pointArr collect (cos p.x + sin p.y) -- compute a value to sort by
qsort indexArr sortFn -- sort the indices
for i = 1 to pointArr.count collect pointArr[indexArr[i]] -- return the points sorted by index
)
This works fine, but for large point counts it would be faster without the first and last for-collect loops. Is it possible to do something like this:
valueArr = #() -- declare here so it can be seen by functions
-- here's the part I don't know how to do: getting the index of a or b
fn sortFn a b = if valueArr[(index of a)] > valueArr[(index of b)] then 1 else -1
fn sortPoints pointArr =
(
valueArr = for p in pArr collect (cos p.x + sin p.y) -- compute some value to sort by
qsort pointArr sortFn -- sort the actual point array
)
any help is appreciated. Thanks!
