快速排序(golang 递归和迭代实现)
代码如下:
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func pivot(arr []int, begin int, end int) int { 8 end-- 9 temp := arr[begin] 10 // 为减小最坏情况发生的几率,可以在begin和end之间随机选择一个数,来和arr[begin]进行交换,在开始下面的过程 11 for begin < end { 12 for begin < end { 13 if arr[end] < temp { 14 arr[begin] = arr[end] 15 begin++ 16 break 17 } 18 end-- 19 } 20 for begin < end { 21 if arr[begin] > temp { 22 arr[end] = arr[begin] 23 end-- 24 break 25 } 26 begin++ 27 } 28 } 29 30 arr[begin] = temp 31 return begin 32 } 33 34 // 快速排序递归实现(注意递归可能造成栈溢出) 35 func RecursiveQuickSort(arr []int, begin int, end int) { 36 // 递归退出条件 37 if end-begin < 2 { 38 return 39 } 40 index := pivot(arr, begin, end) 41 42 RecursiveQuickSort(arr, begin, index) 43 RecursiveQuickSort(arr, index+1, end) 44 45 } 46 47 // 快速排序迭代实现 48 type pair struct { 49 begin int // 二分之后索引较小的位置 50 end int // 二分之后索引较大的位置 51 } 52 53 func iterationQuickSort(arr []int) { 54 pairArray := make([]pair, 0) 55 pairArray = append(pairArray, pair{begin: 0, end: len(arr)}) 56 57 for len(pairArray) > 0 { 58 tempPair := pairArray[len(pairArray)-1] // 获取栈顶元素 59 pivotIndex := pivot(arr, tempPair.begin, tempPair.end) // 对pair保存的begin和end之间的数据进行排序 60 pairArray = pairArray[:len(pairArray)-1] // 弹出栈顶元素 61 if pivotIndex-tempPair.begin >= 2 { // 判断待排序区间之间的元素个数是否超过两个 62 pairArray = append(pairArray, pair{begin: tempPair.begin, end: pivotIndex}) 63 } 64 if tempPair.end-(pivotIndex+1) >= 2 { 65 pairArray = append(pairArray, pair{begin: pivotIndex + 1, end: tempPair.end}) 66 } 67 } 68 } 69 70 func main() { 71 arr := []int{67, 4, 6, 45, 3, 21, 12, 6, 2, 4, 5, 2, 233, 2333} 72 // RecursiveQuickSort(arr, 0, len(arr)) 73 // iterationQuickSort(arr) 74 fmt.Println(arr) 75 }