快速排序是一种常用的基于比较的排序算法,它的核心思想是通过选取一个基准值将待排序序列分成两部分,左半部分中所有元素小于等于基准值,右半部分中所有元素大于等于基准值。然后递归地对左右两个子序列进行排序。
以下是 golang 实现快速排序的示例代码:
func QuickSort(arr []int) {
quickSort(arr, 0, len(arr)-1)
}
func quickSort(arr []int, left int, right int) {
if left >= right {
return
}
pivotIndex := partition(arr, left, right)
quickSort(arr, left, pivotIndex-1)
quickSort(arr, pivotIndex+1, right)
}
// 划分函数
func partition(arr []int, left int, right int) int {
// 以 arr[left] 为枢轴
pivot := arr[left]
for left < right {
// 找到第一个比枢轴小的位置
for left < right && arr[right] >= pivot {
right--
}
arr[left] = arr[right]
// 找到第一个比枢轴大的位置
for left < right && arr[left] <= pivot {
left++
}
arr[right] = arr[left]
}
// 将枢轴放置到正确位置上
arr[left] = pivot
return left
}
在该代码中,我们使用了递归实现快速排序,并且采用了 Lomuto 分区方法。具体实现步骤如下:
选取枢轴(pivot):选择待排序序列的第一个元素作为枢轴。
划分操作:将待排序序列分成两个子序列,左子序列中所有元素都小于等于枢轴,右子序列中所有元素都大于等于枢轴。
递归操作:对左右两个子序列进行快速排序,直至排序完成。
在划分操作中,我们从数组的两端开始查找比枢轴小和比枢轴大的元素,并交换它们的位置。当左右指针相遇时,将枢轴与当前位置进行交换即可完成一次划分。
时间复杂度:\(O(nlogn)\)
空间复杂度:\(O(logn)\)
稳定性:不稳定




