前言
转眼又到金九银十了,大家都开始准备面试了吗?
面试必备的 二分查找、快速排序和归并排序 你了解多少?
今天我们聊一聊 快排,都 0202年了,难道你还不学会吗?
正文
什么是快排
快速排序(quick sort) 我们通常称它为快排,主要是利用分治的思想, 且时间复杂度为 O(nlogn) 的排序算法。快排和同样利用分治思想的归并排序也有一定的相似之处。
快排的原理
假设有一个数组 array[m:n],我们在下标 m 到 n 之间选择一个数组下标作为 pivot(分区点);
我们遍历 m 到 n 之间的数据,将小于 array[pivot] 的放到左边,将大于 array[pivot] 的放到右边,将 array[pivot] 放到中间(这里是按照 从小到大的顺序排列)。
经过上述步骤后,array[m:n] 大致分成三部分,pivot, left, right.
left 表示pivot 左边的元素,且都是小于 array[pivot]
right 表示 pivot 右边的元素,都大于 array[pivot]
然后我们利用递归和分治的思想,对 pviot 左边数组元素和右边数组元素一次进行上述操作,直至需要排序的数组的区间缩小为1,
即 m = n, 此时数组的所有元素都已经排序完成
代码实现
为了弥补语言差异,这里先放上伪代码:
递归部分:
quickSort(array, m, n): // array:数组; m, n 为数组下标,m <= n
if n <= m: return // 递归退出条件
pivot = partition(array, m, n) // 获取分区点 pivot
quickSort(array, m, pivot-1) // 对 pivot 左边进行排序
quickSort(array, pivot+1, n) // 对 pivot 右边进行排序
分区函数:
partition(array, m, n):
pivot = m
record = n // 记录排序后 piovt 的下标
for i = m; i <= n; i++ {
if array[i] < array[pivot] { // 这里是从小到大进行排序的
swap(array[i], array[record]) // 交换 2 个元素
record++ // 移动记录点
}
}
swap(array[record], array[pivot]) // 交换元素
return record // 返回记录点
代码模板:
go:
func quickSort(array []int, left, right int) {
if right <= left { return }
pivot := partition(array, left, right)
quickSort(array, left, pivot-1)
quickSort(array, pivot+1, right)
}
func partition(array []int, left, right int) int {
pivot, record := right, left
for i := left; i <= right; i++ {
if array[i] < array[pivot] {
array[i], array[record] = array[record], array[i]
record++
}
}
array[record], array[pivot] = array[pivot], array[record]
return record
}
python:
def quickSort(arr, left, right):
if right <= left: return
pivot = partition(arr, left, right)
quickSort(arr, left, pivot-1)
quickSort(arr, pivot+1, right)
def partition(arr, left, right):
pivot, record = right, left
for i in range(left, right+1):
if arr[i] < arr[pivot]:
arr[i], arr[record] = arr[record], arr[i]
record+=1
arr[record], arr[pivot] = arr[pivot], arr[record]
return record
js:
function quickSort(array , left, right) {
if (right <= left) { return }
pivot = partition(array, left, right)
quickSort(array, left, pivot-1)
quickSort(array, pivot+1, right)
}
function partition(array, left, right) {
pivot = right
record = left
for (i = left; i <= right; i++) {
if (array[i] < array[pivot]) {
swap(array, record, i)
record++
}
}
swap(array, record, pivot)
return record
}
function swap(arr, i, j) {
tmp = arr[i]
arr[i]=arr[j]
arr[j]= tmp
}
最后
以上,由于能力有限,疏忽和不足之处难以避免,欢迎读者指正,以便及时修改。
若本文对你有帮助的话,欢迎 点赞👍 和 收藏,感谢支持!