目录
算法介绍
快速排序(Quick Sort)是一种使用分治思想的排序算法,它以一种分而治之的方式将一个数组分成两个子数组,然后递归地对这两个子数组进行排序。
算法思想
快速排序的基本思想是选择一个基准值(pivot),将数组分成两个部分,使得左边的元素都小于基准值,右边的元素都大于基准值。然后对左右两个部分分别进行递归排序。
时间复杂度
快速排序的时间复杂度为O(nlogn),其中n是数组的长度。在最坏的情况下,快速排序的时间复杂度为O(n^2),但平均情况下时间复杂度为O(nlogn),并且具有原地排序的特性(只使用常数级别的额外空间)。
算法实现
具体的排序过程如下:
- 定义QuickSort函数包括三个参数:left:数组最左边下标;right:数组最右边下标;arr:要操作的数组。
- 定义数组中间值pivot,以及代表数组最左边和最右边的l,r。
- 通过数组中间值将数组分为两个部分,通过循环将比pivot小的值放到数组的左边,比pivot大的值放到右边。
- 循环找到左边比pivot大的值,右边比pivot小的值,然后通过中间值将两者进行交换,通过arr[l]和arr[r]是否与pivot相等进行优化
- 然后再通过左递归进行将pivot左边的数进行排序,这里需要注意的是QuickSort函数中的right已经被替换为“4”中的r。
- 通过右递归进行将pivot左边的数进行排序,这里需要注意的是QuickSort函数中的left已经被替换为“4”中的l。
- 我将for循环中的 l 替换为了a,将r替换为了b;通过for循环后的 l 和 r 仍然不变。下图是整个代码中的 l 和 r 的变化。
func QuickSort(left, right int, arr *[6]int) {
l := left
r := right
//pivot 表示中轴
pivot := arr[(left+right)/2]
temp := 0
for l < r {
//先从 pivot 的左边找到大于等于pivot 的值
for arr[l] < pivot {
l++
}
//从 pivot 的右边找到小于等于pivot 的值
for arr[r] > pivot {
r--
}
//如果 左边的值大于右边的值,代表找到了左边大于右边的数
if l >= r {
break
}
temp = arr[l]
arr[l] = arr[r]
arr[r] = temp
if arr[l] == pivot {
r--
}
if arr[r] == pivot {
l++
}
}
if l == r {
l++
r--
}
//向左递归
if left < r {
QuickSort(left, r, arr)
}
//向右递归
if right > l {
QuickSort(l, right, arr)
}
}
整体代码
package main
import "fmt"
//快速排序
//1.left 表示数组最左边的下标
//2.right 表示数组最右边的下标
//arr 表示要排序的数组
func QuickSort(left, right int, arr *[6]int) {
l := left
r := right
//pivot 表示中轴
pivot := arr[(left+right)/2]
temp := 0
//for 循环的目标是将比pivot小的数放在左边,比pivot大的数放在右边
for l < r {
//先从 pivot 的左边找到大于等于pivot 的值
for arr[l] < pivot {
l++
}
//从 pivot 的右边找到小于等于pivot 的值
for arr[r] > pivot {
r--
}
//如果 左边的值大于右边的值,代表找到了左边大于右边的数
if l >= r {
break
}
temp = arr[l]
arr[l] = arr[r]
arr[r] = temp
if arr[l] == pivot {
r--
}
if arr[r] == pivot {
l++
}
}
if l == r {
l++
r--
}
//向左递归
if left < r {
QuickSort(left, r, arr)
}
//向右递归
if right > l {
QuickSort(l, right, arr)
}
}
func main() {
arr := [6]int{-9, 78, 0, 23, -567, 70}
fmt.Println("原始数组:", arr)
QuickSort(0, len(arr)-1, &arr)
fmt.Println("排序后的数组:", arr)
}