递归的三大要素
第一要素:明确你这个函数想要干什么
第二要素:寻找递归结束条件
第三要素:找出函数的等价关系式
快排基本思想
- 选定Pivot中心轴
- 将大于Pivot的数字放在Pivot的右边
- 将小于Pivot的数字放在Pivot的左边
- 分别对左右子序列重复前三步操作
- 左递归
- 右递归
选取中轴 pivot(这里取首元素), left 指向第一个元素下标, right 指向最后一个元素下标,
如果 arr[right] >= pivot ,则 right—
如果 arr[right] < pivot ,则 arr[left] = arr[right] ,left++
如果 arr[left] <= pivot ,则 left++
如果 arr[left] > pivot ,则 arr[right] = arr[left] , right—
Go代码
// 快速排序
package main
import (
"fmt"
)
func quickSort(left int, right int, arr *[8]int) {
// 保留 左右下标值,不参与运算, 只用来传递参数,定义运算边界,划分子问题
L := left // 值拷贝
R := right
// 递归结束条件
if left >= right {
return
}
// 中轴
pivot := arr[left]
// 从小到大排
for left < right {
for left < right && arr[right] >= pivot {
right--
}
if left < right {
arr[left] = arr[right] // 移动值
}
for left < right && arr[left] <= pivot {
left++
}
if left < right {
arr[right] = arr[left]
}
if left >= right {
arr[left] = pivot
}
}
fmt.Println(left, right, arr)
// 划分子问题
// 左递归
quickSort(L, right-1, arr)
// 右递归
quickSort(right+1, R, arr)
}
func main() {
// arr := [6]int{-9, 78, 0, 23, -567, 70}
arr := [8]int{5, 8, 1, 3, 6, 2, 4, 7}
fmt.Println("arr = ", arr)
quickSort(0, len(arr)-1, &arr)
fmt.Println("arr = ", arr)
}
/*
arr = [5 8 1 3 6 2 4 7]
4 4 &[4 2 1 3 5 6 8 7]
3 3 &[3 2 1 4 5 6 8 7]
2 2 &[1 2 3 4 5 6 8 7]
0 0 &[1 2 3 4 5 6 8 7]
5 5 &[1 2 3 4 5 6 8 7]
7 7 &[1 2 3 4 5 6 7 8]
arr = [1 2 3 4 5 6 7 8]
*/
JS代码
var arr = [5, 1, 42, 10, 28]
// 冒泡排序
function bubbleSort(arr) {
var temp = 0
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 交换位置
temp = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = temp
}
}
}
}
// bubbleSort(arr)
console.log(arr);
// 快速排序
function Quicksort(left, right, arr) {
var L = left
var R = right
if (left >= right) {
return
}
// 选定中轴
var pivot = arr[left]
while (left < right) {
while (left < right && arr[right] > pivot)
right--
if (left < right) {
arr[left] = arr[right]
}
while (left < right && arr[left] <= pivot)
left++
if (left < right) {
arr[right] = arr[left]
}
if (left >= right) {
arr[left] = pivot
}
}
// 左递归
Quicksort(L, right - 1, arr)
// 右递归
Quicksort(right + 1, R, arr)
}
Quicksort(0, arr.length - 1, arr)
console.log(arr);