快速排序(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 }

 

posted @ 2020-11-10 10:10  路璐  阅读(457)  评论(0编辑  收藏  举报