经典面试题31 - 快速排序

经典面试题31 - 快速排序_第1张图片

问题

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

解答

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

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

func quicksort(_ 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数组拼接在一起即可。

来看张运行图加深理解


经典面试题31 - 快速排序_第2张图片

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

更多

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

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

  • 直接添加公众号豆志昂扬
  • 微信扫描下图二维码;
经典面试题31 - 快速排序_第3张图片

你可能感兴趣的:(经典面试题31 - 快速排序)