请你收下这份快速排序的模板

1,667 阅读1分钟

前言

转眼又到金九银十了,大家都开始准备面试了吗?

面试必备的 二分查找、快速排序和归并排序 你了解多少?

今天我们聊一聊 快排,都 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, 此时数组的所有元素都已经排序完成

quick sort

代码实现

为了弥补语言差异,这里先放上伪代码:

递归部分:

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
}

最后

以上,由于能力有限,疏忽和不足之处难以避免,欢迎读者指正,以便及时修改。

若本文对你有帮助的话,欢迎 点赞👍 和 收藏,感谢支持!