快排(golang实现) 递归方法

Posted brave-xin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快排(golang实现) 递归方法相关的知识,希望对你有一定的参考价值。

递归方法,逻辑简洁清晰。这个算法还是很重要的,需要重点记忆理解,面试经常考,与傅里叶变换等并称“20世纪十大算法”。

快速排序算法的平均时间复杂度是 O(nlogn),最坏情况时间复杂度是 O(n^2)

  

package main

import (
	"fmt"
)

func main() {
	var arr = []int{4, 7, 6, 8, 3, 2, 8, 1}
	fmt.Println(arr)
	quickSort(arr, 0, len(arr)-1)
	fmt.Println(arr)
}

func quickSort(arr []int, startIndex, endIndex int) int {
	// 递归结束条件:startIndex大等于endIndex的时候
	if startIndex >= endIndex {
		return -1
	}
	// 得到基准元素位置
	var pivotIndex = partition(arr, startIndex, endIndex)
	// 根据基准元素,分成两部分递归排序(分治法)
	quickSort(arr, startIndex, pivotIndex-1)
	quickSort(arr, pivotIndex+1, endIndex)
	return 0
}

func partition(arr []int, startIndex, endIndex int) int {
	// 取第一个位置的元素作为基准元素
	var pivot = arr[startIndex]
	var left = startIndex
	var right = endIndex
	for left != right {
		//控制right指针比较并左移
		for left < right && arr[right] > pivot {
			right--
		}
		//控制right指针比较并右移

		for left < right && arr[left] <= pivot {
			left++
		}
		//交换left和right指向的元素
		if left < right {
			p := arr[left]
			arr[left] = arr[right]
			arr[right] = p
		}
	}
	//pivot和指针重合点交换
	p := arr[left]
	arr[left] = arr[startIndex]
	arr[startIndex] = p
	return left
}

  

以上是关于快排(golang实现) 递归方法的主要内容,如果未能解决你的问题,请参考以下文章

Partition算法以及其应用详解(Golang实现)

8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)

8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)

快排---非递归实现

代码片段 - Golang 实现简单的 Web 服务器

代码片段 - Golang 实现集合操作