Junkor

函数式快排(Functional Quicksort)

文章翻译自objc,原文连接:『Functional Quicksort

下面是一个快排的变体实现,并没在速度上有所改良,大多快排实现的空间复杂度也是恒定的。不过,这段代码应该是最简洁最清晰的一种实现:

func qsort(input: [Int]) -> [Int] {
	if let (pivot, rest) = input.decompose {
    	let lesser = rest.filter { $0 < pivot }
    	let greater = rest.filter { $0 >= pivot }
    	return qsort(lesser) + [pivot] + qsort(greater)
	} else {
    	return []
	}
}

这段代码是构建在之前的拆解数组基础之上的:如果数组不为空,就以第一个数组元素为参照,把数组拆分到两个新的数组:第一个数组中包含的都是比参照小的元素,第二个数组是包含的大于或者等于参照的元素。然后,排序第一个数组,加上参照,加上排序后的第二个数组,就ok了。