Swift实现的快速排序及sorted方法的对比
Swift语言有着优秀的函数式编程能力,面试的时候面试官都喜欢问我们快速排序,那么用Swift如何实现一个快速排序呢?首先扩展Array类: extension Array {
var decompose : (head: T,tail: [T])? {
return (count > 0) ? (self[0],Array(self[1..<count])) : nil
}
}
属性decompose的作用是返回数组中的第一个元素和剩下的元素,注意这个属性是可选型的,当count为0的时候返回nil,count是Array的属性。使用扩展的原因是这种拆分可以实现非常多的操作,一劳永逸。 func qsortDemo(input: [Int]) -> [Int] {
if let (pivot,rest) = input.decompose {
let lesser = rest.filter { $0 < pivot }
let greater = rest.filter { $0 >= pivot }
return qsortDemo(lesser) + [pivot] + qsortDemo(greater)
} else {
return []
}
}
可以发现使用Swift实现快速排序的代码非常的简洁。首先调用待排序序列的decompose属性,使用一个元组来保存数组的第一个元素和首先的数组,由于依旧是采用递归的方式,所以使用可选绑定来做边界判断。在可选绑定内部使用了filter方法来分割元素,省去了比较移动元素的复杂过程,得到的lesser是小于pivot的数组、greater是大于pivot的数组,在返回时使用了数组的拼接并对拆分的数组进行递归,结构非常的简单,至此一个快速排序的过程就结束了。 var a:[Int] = [1,2,4,6,3,7,8]
qsortDemo(a)
数组a在快排中的效率如下: let b = a.sorted{$0<$1}
效果如何呢?请看下图: var a:[Int] = [1,1,1]
数组的整体大小没有发生变化,运行效率如图: var a:[Int] = [1,2,3,1]
没有等于号的情况: var a:[UInt32] = []
for _ in 0..<500{
a.append(arc4random() % 100)
}
同时比较两种排序方式,下面是快排的: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |