Сортировка выбором в SML с изюминкой

Я начинаю лучше знакомиться с 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, буду признателен за любой вклад. Спасибо!


person MCR    schedule 24.02.2012    source источник


Ответы (1)


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

Например, посмотрите на встроенную функцию 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 для выполнения этой «сортировки с изюминкой» или даже использовать ее для сортировки нецелочисленных списков (если вы даете ей функцию сравнения с соответствующим типом).

person Nick Barnes    schedule 24.02.2012
comment
Спасибо за ваш ответ, это определенно будет полезно. Моя самая большая проблема заключается в том, чтобы выяснить, как заставить работать сортировку выбором. В java я бы запрограммировал его туда, где он будет перебирать массив, делать своп, обновлять мои индексы и рекурсивно. В sml у меня нет такой роскоши, как индексы и подкачка (насколько мне известно). Так что я не знаю, как мне это настроить. - person MCR; 24.02.2012
comment
Извини, я думал, что это просто поворот, который сбил тебя с толку. Я обновлю свой ответ. - person Nick Barnes; 24.02.2012
comment
Гений. Это очень помогло. Спасибо. - person MCR; 24.02.2012