Skip to main content
 首页 » 操作系统

swift之具有 haskell 风格的 swift 快速排序

2024年01月01日39youxin

我正在 swift 中实现一个快速排序算法。基本上我想实现一些 Haskell 风格的清晰度。这是到目前为止我可以开发的代码:

func quickSort<T: Comparable>(list: [T]) -> [T] { 
    if list.isEmpty { 
        return [] 
    } else { 
        let head = list[0] 
        return quickSort(list.filter {$0 <= head}) + [head] + quickSort(list.filter {$0 > head}) 
    } 
} 

我们可以改进这段代码使其看起来更像 Haskell 风格吗?你有什么建议?

请您参考如下方法:

好吧,如果你想复制的 Haskell 看起来像这样:

quicksort :: (Ord a) => [a] -> [a] 
quicksort [] = [] 
quicksort (x:xs) = 
    let smallerOrEqual = filter (<= x) xs 
        greater = filter (> x) xs 
    in  quicksort smallerOrEqual ++ [x] ++ quicksort greater 

您可以添加此 Swift 数组扩展(我 stole from objc.io ):

extension Array { 
    var decompose : (head: T, tail: [T])? { 
        return (count > 0) ? (self[0], Array(self[1..<count])) : nil 
    } 
} 

然后做这样的事情:

func recursiveQuicksort<T: Comparable>(inputArray:Array<T>) -> Array<T> { 
    if let (x, xs) = inputArray.decompose { 
        let smallerOrEqual = xs.filter{$0 <= x} 
        let greater = xs.filter{$0 > x} 
        return recursiveQuicksort(smallerOrEqual) + [x] + recursiveQuicksort(greater) 
    } else { 
        return inputArray 
    } 
} 

扩展为您提供了一点点模式匹配以更接近 Haskell,其余的很容易看出它如何在两种语言之间映射。不过,Haskell 的语法仍然更加简洁。