Reversing and then using the stable sort sounds like an elegant solution. Thanks!
@Robert I totally missed the indexes could refer to swapped items. I somehow had the impression that go would memorize the returned order and swap them in one go. This explains it. Thanks a lot. On Wednesday, December 7, 2022 at 12:07:48 PM UTC+8 harr...@spu.edu wrote: > > In my real code I have other criteria to compare the slice items, but if > they tie, I want to use the reverse of their original order. > > Oh, forgot to say: FWIW - I think reversing and then sort.SliceStable > might be a solution - asymptotically reverse should be less complex than > the sort, or probably there are other variations that don't require > reimplementing sorting. > On Tuesday, December 6, 2022 at 7:47:04 PM UTC-8 Andrew Harris wrote: > >> Just as an intuitive argument, we could do: >> sort.Slice(s, func(i, j int) bool { log.Println(i, j); return i > j }) >> >> The appearances of i and j per step recapitulate the logic of the sorting >> algo in some weak sense; not slice order >> On Tuesday, December 6, 2022 at 7:28:39 PM UTC-8 hey...@gmail.com wrote: >> >>> > sorts defined by an ordering function purely dependent on the value of >>> the element >>> >>> Hmm, I thought the function was agnostic to what really get compared? If >>> it offers two index numbers, and the return value says the one with larger >>> index number should be at the front, shouldn't the sort function simply do >>> that, since during the sorting, the passed index number should be stable? >>> On Wednesday, December 7, 2022 at 11:14:37 AM UTC+8 harr...@spu.edu >>> wrote: >>> >>>> Oh, to reverse by index ... I think this doesn't quite fit in the idea >>>> of sorts defined by an ordering function purely dependent on the value of >>>> the element. >>>> >>>> I think there may have been a feature request >>>> <https://github.com/golang/go/issues/47988> for a `slices.Reverse` >>>> function in golang.org/x/exp/slices - I'm not sure what the status or >>>> reasoning is on this. FWIW it's not the only approach that might make >>>> sense >>>> for traversing a slice in reverse order, and it can be naive when working >>>> with e.g. bytes holding utf8. >>>> >>>> I think this works but I haven't really thought about edge cases... >>>> >>>> `reverse(&s)` >>>> >>>> func reverse[T any](s *[]T) { >>>> z := len(*s) >>>> for a := 0; a < len(*s)/2; a++ { >>>> (*s)[a], (*s)[z-a-1] = (*s)[z-a-1], (*s)[a] >>>> } >>>> } >>>> >>>> On Tuesday, December 6, 2022 at 6:54:38 PM UTC-8 hey...@gmail.com >>>> wrote: >>>> >>>>> Thanks for the quick reply. >>>>> >>>>> But that seems to compare values. I'd like to compare index numbers. >>>>> The fact that original values follow index number order is a coincidence. >>>>> >>>>> > I think it'd be recommended to look at the generics slices package, >>>>> which also has a sort >>>>> >>>>> Do you mean golang.org/x/exp/slices? That also seems to only compare >>>>> values. >>>>> >>>>> >>>>> On Wednesday, December 7, 2022 at 10:45:33 AM UTC+8 harr...@spu.edu >>>>> wrote: >>>>> >>>>>> Subtly: >>>>>> return s[i] > s[j] >>>>>> >>>>>> Is the right sort func >>>>>> >>>>>> I think it'd be recommended to look at the generics slices package, >>>>>> which also has a sort >>>>>> On Tuesday, December 6, 2022 at 6:39:29 PM UTC-8 hey...@gmail.com >>>>>> wrote: >>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> I have this very simple sorting code: >>>>>>> >>>>>>> s := make([]int, 0, 100) >>>>>>> for i := 1; i <= 20; i++ { >>>>>>> s = append(s, i) >>>>>>> } >>>>>>> sort.Slice(s, func(i, j int) bool { return i > j }) >>>>>>> log.Print(s) >>>>>>> >>>>>>> I expect it to print numbers in reverse order, since items with >>>>>>> larger index numbers should be at the front. However, at lease in >>>>>>> go1.19.3, >>>>>>> it prints >>>>>>> >>>>>>> [9 1 8 5 16 3 20 2 10 7 12 13 14 15 6 4 19 18 17 11] >>>>>>> >>>>>>> I guess I must have misunderstood how the sort package works, but >>>>>>> rereading sort's doc multiple time doesn't help answer the question. >>>>>>> >>>>>>> Could anyone shed some light? >>>>>>> >>>>>> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/57b141f1-a320-4e80-b646-890118552d9bn%40googlegroups.com.