Given a linear list, is there a library function in ATS that shuffles the list randomly to produce a permutation of it:
fun{a:t@ype}
list_vt_permute{n:int}(xs: list_vt(a, n)): list_vt(a, n)
If possible, I would prefer an implementation of list_vt_permute that does not call malloc/free.
Yes, there is such a function declared in prelude/list_vt.sats, which is based on the function
array_permutedeclared in prelude/array.sats.Note that
list_vt_permutecallslist_vt_permute$randintfor generating random numbers, and it essentially implements the Fisher-Yates algorithm to perform random shuffling. The functionlist_vt_permuteis O(n)-time and it does need to allocate memory for temporary use.As for a version of
list_vt_permutethat does not need malloc/free, it can be implemented like mergesort, taking O(n*log(n))-time to finish.