Go 实现快速排序算法

359 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

Go 实现快速排序算法

快速排序算法

算法简介:快速排序算法是对冒泡算法一种优化,利用对问题的二分优化,实现递归方式完成快速方式。时间复杂度为O(NlgN)

快速排序是一种分而治之思想在排序算法上的应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

算法步骤

  • 将数据按照一个值分成两段,左边小于此值,右边大于这个数。
  • 将两边数据递归的调用上面这步骤

一般来说,标准的快速排序是取数组的第一个元素进行分组,如果此时数组的数据已经排序好了,算法的时间复杂度会膨胀到 O(N^2),要避免这个情况,可以随机取一个数避免产生这个情况。

算法实现

  1. 随机挑选一个数作为基准
  2. 比基准小的数放到基准左边,比基准大的数放到基准右边,基准放到这个中间位置。过程就是从右往左找,找到第一个小于基准的数,从左往右找,找到第一个大于基准的数,交换这两个数,将基准放到左边位置
  3. 递归执行上面的步骤
package main

import (
	"fmt"
	"testing"
)

func QuickSort(arr []int, start int, end int) {
	if start < end {
		mid := partition(arr, start, end)
		QuickSort(arr, start, mid-1)
		QuickSort(arr, mid+1, end)
	}
}

// 找到 pivot 位置
func partition(arr []int, start int, end int) int {
	pivot := arr[start]
	for start < end {
		for start < end && pivot <= arr[end] {
			end--
		}
		// 填补 low 位置空值
		arr[start] = arr[end]
		for start < end && pivot >= arr[start] {
			start++
		}
		// 填补end位置空值
		arr[end] = arr[start]
	}
	//pivot 填补 low位置的空值
	arr[start] = pivot
	return start
}

// 快速排序算法
func TestQuickSort(t *testing.T) {
	arr := []int{1, 9, 10, 30, 2, 5, 45, 8, 63, 234, 12}
	QuickSort(arr, 0, len(arr)-1)
	fmt.Println(arr)
}