Выбор сортировки в SML с поворотом - PullRequest
1 голос
/ 24 февраля 2012

Я начинаю больше знакомиться с sml, но эта проблема заставила меня задуматься.Что мне нужно сделать, это выполнить сортировку выбора в списке, но суть в том, что все четные числа должны пройти нечетные.

Например:

selSort[1, 6, 9, 3, 8, 4, 7, 2, 5, 3];
val it = [2, 4, 6, 8, 1, 3, 5, 7, 9] : int list

Я не могу заставить себя сделать это, не имея каких-то циклов for или переменных, которые могут мне помочь.Поскольку я новичок в sml, любой вклад будет оценен.Спасибо!

1 Ответ

3 голосов
/ 24 февраля 2012

Структуры данных в функциональных языках обычно неизменяемы ;то есть они не могут быть изменены после создания.Таким образом, вы не можете выполнять замену на месте, как в итеративной реализации на основе массива.Вместо этого вам нужно написать функцию, которая принимает ваш исходный список в качестве аргумента и возвращает его независимую копию с желаемыми изменениями.

Например, посмотрите на встроенную функцию rev.Он возвращает обратную версию любого списка, который вы передали ему, но он не изменяет (на самом деле, может не) структуру исходного списка.

В этом случае вам, вероятно, понадобитсяфункция min(xs) для поиска наименьшего элемента x в xs и функция remove(x,xs), которая возвращает копию xs с удаленным x (назовем его remainder).Затем просто рекурсивно сортируйте remainder и добавьте x к результату.

Вместо использования < для сравнения элементов в min, вы можете навязать этот необычный порядок, определив собственную функцию сравнения lessThan, где lessThan(x,y) всегда истинно, если x четное и y нечетное.

fun lessThan(x,y) = (x mod 2 = 0 and y mod 2 = 1) or (x mod 2 = y mod 2 and x < y)

Теперь просто замените любой экземпляр x < y в вашей функции min(xs) на lessThan(x,y).

Еще лучше написать версию selSort(list,comp), которая принимает в качестве аргумента функцию сравнения comp.Затем вы можете передать его (op <), чтобы выполнить стандартную сортировку, lessThan, чтобы выполнить эту "сортировку с изюминкой", или даже использовать ее для сортировки нецелых списков (при условии, что вы предоставляете ему функцию сравнения с соответствующим типом).).

...