快排(golang实现) 递归方法
递归方法,逻辑简洁清晰。这个算法还是很重要的,需要重点记忆理解,面试经常考手写。据说是与傅里叶变换等并称“20世纪十大算法”。https://blog.csdn.net/v_JULY_v/article/details/6127953
快速排序算法的平均时间复杂度是 O(nlogn),最坏情况时间复杂度是 O(n^2)。
package main import ( "fmt" ) func main() { var arr = []int{9, 4, 7, 6, 8, 3, 2, 5, 1} fmt.Println("before", arr) quickSort(arr, 0, len(arr)-1) fmt.Println("after ", arr) } /***************************************************************************** * \author * \date * \brief 递归快排 * \param[in] arr:待排序切片 startIndex,endIndex:起始,结束索引 * \param[out] * \return 输入返回值描述 * \ingroup 输入所属组 * \remarks *****************************************************************************/ func quickSort(arr []int, startIndex, endIndex int) { // 递归结束条件:startIndex大等于endIndex的时候 if startIndex >= endIndex { return } // 得到基准元素位置 var pivotIndex = partition(arr, startIndex, endIndex) // 根据基准元素,分成两部分递归排序(分治法) quickSort(arr, startIndex, pivotIndex-1) quickSort(arr, pivotIndex+1, endIndex) return } 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 { arr[left], arr[right] = arr[right], arr[left] } } //pivot和指针重合点交换 arr[left], arr[startIndex] = arr[startIndex], arr[left] return left }
QQ:814884182