美文网首页
经典面试题31 - 快速排序

经典面试题31 - 快速排序

作者: 豆志昂扬 | 来源:发表于2018-05-15 23:45 被阅读368次

问题

请使用快速排序把数组从低到高排序。
如数组 [ 10, 0, 3, 9, 2, 14, 8, 27, 1, 5, 8, -1, 26 ]

解答

快速排序是历史上最有名的算法之一,也是递归算法的经典案例。

直接来看看Swift版本的源码:

func quicksort<T: Comparable>(_ a: [T]) -> [T] {
  guard a.count > 1 else { return a }

  let pivot = a[a.count/2]
  let less = a.filter { $0 < pivot }
  let equal = a.filter { $0 == pivot }
  let greater = a.filter { $0 > pivot }

  return quicksort(less) + equal + quicksort(greater)
}

对于C语言的源码,高级语言读起来更容易理解。

上述的代码中,首先取数组中的位置中间的值为中轴值 (如取中轴值是优化快速排序算法的关键,有兴趣的可以单独研究)。

所有比中轴值小的元素都在less数组内,而等于中轴值的元素在equal数组里,大于中轴值的元素在greater数组内,注意下范型T实现了“Comparable”,这样才能执行元素之间比较大小。

在完成三个数组赋值以后,递归算法这时显现出了可魔力,只需对less 和 greater数组进行快排,然后把equal数组拼接在一起即可。

来看张运行图加深理解


注意的是算法里反复调用filter方法,无论空间和时间上效率都有很大的改进空间。

更多

经典面试100题 - 持续更新中

获取更多内容请关注微信公众号豆志昂扬:

  • 直接添加公众号豆志昂扬
  • 微信扫描下图二维码;

相关文章

网友评论

      本文标题:经典面试题31 - 快速排序

      本文链接:https://www.haomeiwen.com/subject/yebydftx.html