快速排序

86 阅读2分钟

快排基本思想

  1. 选定Pivot中心轴

  2. 将大于Pivot的数字放在Pivot的右边

  3. 将小于Pivot的数字放在Pivot的左边

  4. 分别对左右子序列重复前三步操作

    4.1 左递归

    4.2 右递归

选取中轴 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 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);
// [1, 5, 10, 28, 42]


🎈🎈🎈

🌹 持续更文,关注我,你会发现一个踏实努力的宝藏前端😊,让我们一起学习,共同成长吧。

🎉 喜欢的小伙伴记得点赞关注收藏哟,回看不迷路 😉

✨ 欢迎大家评论交流