我需要在SML中實現快速排序來完成家庭作業,而且我迷路了。我之前並不熟悉quicksort是如何實現的,所以我讀到了這一點,但是我讀到的每一個實現都是非常重要的。這些看起來並不難,但我不知道如何在功能上實現快速排序。以函數式語言實現快速排序
維基百科碰巧在Standard ML(這是我的任務所需的語言)中有quicksort代碼,但我不明白它是如何工作的。
維基百科代碼:
val filt = List.filter
fun quicksort << xs = let
fun qs [] = []
| qs [x] = [x]
| qs (p::xs) = let
val lessThanP = (fn x => << (x, p))
in
qs (filt lessThanP xs) @ p :: (qs (filt (not o lessThanP) xs))
end
in
qs xs
end
特別是,我不明白這行:qs (filt lessThanP xs) @ p :: (qs (filt (not o lessThanP) xs))
。假設函數<(x,p)函數返回true,則過濾器將返回x小於p *的所有內容的列表,該列表與p相連,並與p相鏈接,該列表包含所有內容> = p。*
* x < p。當然,它不一定是那樣。
實際上,輸入這些信息有助於我理解發生了什麼。無論如何,我試圖將SML函數與後面的wiki的quicksort僞代碼進行比較。
功能快速排序當分區被定義爲
// left is the index of the leftmost element of the array
// right is the index of the rightmost element of the array (inclusive)
// number of elements in subarray = right-left+1
function partition(array, 'left', 'right', 'pivotIndex')
'pivotValue' := array['pivotIndex']
swap array['pivotIndex'] and array['right'] // Move pivot to end
'storeIndex' := 'left'
for 'i' from 'left' to 'right' - 1 // left ≤ i < right
if array['i'] < 'pivotValue'
swap array['i'] and array['storeIndex']
'storeIndex' := 'storeIndex' + 1
swap array['storeIndex'] and array['right'] // Move pivot to its final place
return 'storeIndex'
那麼,到底其中分隔發生(數組, '左', '右')
// If the list has 2 or more items
if 'left' < 'right'
// See "Choice of pivot" section below for possible choices
choose any 'pivotIndex' such that 'left' ≤ 'pivotIndex' ≤ 'right'
// Get lists of bigger and smaller items and final position of pivot
'pivotNewIndex' := partition(array, 'left', 'right', 'pivotIndex')
// Recursively sort elements smaller than the pivot
quicksort(array, 'left', 'pivotNewIndex' - 1)
// Recursively sort elements at least as big as the pivot
quicksort(array, 'pivotNewIndex' + 1, 'right')
?還是我錯誤地思考SMLs quicksort?
感謝您澄清我的誤解。 此外,我很困惑在SML代碼中發生分區的位置,而不是僞代碼。對不起,如果不明確。 – Nate
@rob,@nate:「... filt將返回x小於p *的所有內容的列表,它與p相連,它包含在所有內容> = p。*中」這實際上並不完全正確。隱式括號如下所示:qs(filt lessThanP xs)@'('p ::(qs(filt(not o lessThanP)xs))')'。你不能列表列表,只有單個元素。列表被相互追加(@)。 –