码迷,mamicode.com
首页 > 其他好文 > 详细

快排(golang实现) 递归方法

时间:2018-08-13 12:21:34      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:ret   复杂   元素   turn   ack   排序算法   递归   tar   --   

递归方法,逻辑简洁清晰。这个算法还是很重要的,需要重点记忆理解,面试经常考,与傅里叶变换等并称“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实现) 递归方法

标签:ret   复杂   元素   turn   ack   排序算法   递归   tar   --   

原文地址:https://www.cnblogs.com/brave-xin/p/9466840.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!