2012-02-24 74 views
1

我開始變得更加熟悉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新手,任何輸入將不勝感激。謝謝!

回答

3

功能語言的數據結構一般是不可變的;也就是說,創建後不能修改它們。所以你不能像在基於數組的迭代實現中那樣執行就地交換。相反,您需要編寫一個函數,將您的原始列表作爲參數,並返回其所需更改的獨立副本。

例如,看看內置功能rev。它會返回您傳遞給它的任何列表的反轉版本,但它不會(實際上,它不會改變原始列表的結構)。

在這種情況下,你可能需要一個功能min(xs)找到最小的元素xxs和功能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) 

現在只是lessThan(x,y)替換您min(xs)功能x < y任何實例。

更好的是,編寫一個版本selSort(list,comp),它將比較函數comp作爲參數。然後你可以通過(op <)執行一個標準排序,lessThan執行這個「用扭曲排序」,甚至可以用它排序非整數列表(只要你給它一個相應類型的比較函數)。

+0

謝謝你的迴應,這肯定會有幫助。我最大的問題是弄清楚如何讓選擇排序工作。在java中,我將它編程到它將遍歷數組的位置,進行交換,更新我的索引並遞歸。在sml中,我沒有奢侈的索引和交換(據我所知)。所以,我不知道如何設置這個。 – MCR 2012-02-24 01:38:58

+0

對不起,我以爲這只是把你扔掉的「扭曲」。我會更新我的答案。 – 2012-02-24 01:42:44

+0

天才。這幫了一大筆錢。謝謝。 – MCR 2012-02-24 16:17:01