排序算法:快速排序

排序算法:快速排序

交换排序

1. 简介

快速排序是对冒泡算法的一种改进。
基本原理:
以第1个元素数据为枢轴,第1个元素索引为低位索引,最后1个元素索引为高位索引, 高位从后向前遍历并判断大小。
如果低位元素小于高位元素不操作高位继续向前遍历,否则将高位的数据保存到低位上并将低位索引向后移1位,低位从前向后遍历并判断大小。
如果低位元素小于高位元素不操作低位继续向后遍历,否则将低位的数据保存到高位上并将高位索引向前移1们,重新开始高位从后向前遍历判断大小。
一直重复下去直到低位索引不小于高位索引,将枢轴数据保存到低位索引上,然后将当前数据以枢轴元素的位置为中心分成两部份。并将两部份分别在执行上面步骤,一直重复直到每个部份元素为1个时。

2. 图示

quick-sort

3. 演示

3.1. 文件树形图

quicksort
├── go.mod
├── quicksort.go
└── quicksort_test.go

3.2. 代码

quicksort.go

package quicksort

func QuickSort(array []int) {
	qSort(array, 0, len(array)-1)
}

func qSort(array []int, low, high int) {
	if low < high {
		pivot := partition(array, low, high)

		qSort(array, low, pivot-1)
		qSort(array, pivot+1, high)
	}
}

// 返回枢轴索引
func partition(array []int, low, high int) int {
	pivot := array[low]
	t := array[low]
	for low < high {
		// 从后向前扫描
		for low < high && array[high] >= pivot {
			high--
		}
		// 如果low<high停止代表碰到,array[high] < pivot的数字
		if low < high {
			array[low] = array[high]
			low++
		}

		// 从前向后扫描
		for low < high && array[low] <= pivot {
			low++
		}
		// 如果low<high停止代表碰到,array[low] > pivot的数字
		if low < high {
			array[high] = array[low]
			high--
		}
		array[low] = t
	}
	return low
}

quicksort_test.go

package quicksort

import (
	"testing"
)

func TestQuickSort(t *testing.T) {
	arr := []int{55, 22, 44, 67, 35, 77, 18, 69}
	QuickSort(arr)
	t.Log(arr)
}

3.3. 测试

=== RUN   TestQuickSort
    TestQuickSort: quicksort_test.go:10: [18 22 35 44 55 67 69 77]
--- PASS: TestQuickSort (0.00s)
PASS

4. 参考

  • 《C/C++函数与算法速查手册》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yimtcode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值