Является ли F # ResizeArray sortBy стабильным? - PullRequest
4 голосов
/ 10 июля 2010

Делает ли функция ResizeArray.sortBy стабильную сортировку в том смысле, что она не меняет порядок элементов, имеющих одинаковое значение для ключевой функции?

А если нет, как написатьстабильная сортировка в F #?

Ответы [ 2 ]

10 голосов
/ 10 июля 2010

Ответ на ваш вопрос unstable.

Первый ResizeArray.sortBy реализован следующим образом:

module ResizeArray =
    let sortBy f (arr: ResizeArray<'T>) = arr.Sort (System.Comparison(fun x y -> compare (f x) (f y)))

И ResizeArray - псевдоним для коллекции .Net List:

type ResizeArray<'T> = System.Collections.Generic.List<'T> // alias

Теперь давайте посмотрим на Список документации :

Этот метод использует Array.Sort, который использует алгоритм QuickSort.Эта реализация выполняет нестабильную сортировку;то есть, если два элемента равны, их порядок может не сохраниться.Напротив, стабильная сортировка сохраняет порядок элементов, которые равны.

Так неустойчиво.Если вам нужна стабильная сортировка, вы можете реализовать сортировку слиянием или тщательную быструю сортировку.Однако стабильная версия быстрой сортировки менее эффективна.

3 голосов
/ 10 июля 2010

Seq.sort стабильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...