6
6
7
7
package Quick_Sort
8
8
9
- import "Golang_Algorithm/Data_Structure/Stack"
9
+ // import "Golang_Algorithm/Data_Structure/Stack"
10
10
11
11
func partition (nums []int , left int , right int ) int {
12
12
// 选第一个元素作为枢纽元
@@ -29,26 +29,88 @@ func partition(nums []int, left int, right int) int {
29
29
}
30
30
31
31
func Quick_Sort_Unrecurse (nums []int ) {
32
- sort_stack := Stack .New ()
33
- left := 0
34
- right := len (nums ) - 1
35
- if left < right {
36
- sort_stack .Push (left )
37
- sort_stack .Push (right )
38
- for sort_stack .IsEmpty () == false {
39
- j := sort_stack .Top ().(int )
40
- sort_stack .Pop ()
41
- i := sort_stack .Top ().(int )
42
- sort_stack .Pop ()
43
- k := partition (nums , i , j )
44
- if i < k - 1 {
45
- sort_stack .Push (i )
46
- sort_stack .Push (k - 1 )
47
- }
48
- if k + 1 < j {
49
- sort_stack .Push (k + 1 )
50
- sort_stack .Push (j )
51
- }
32
+
33
+ /***********************方法1***************************/
34
+ //sort_stack := Stack.New()
35
+ //left := 0
36
+ //right := len(nums) - 1
37
+ //if left < right {
38
+ // sort_stack.Push(left)
39
+ // sort_stack.Push(right)
40
+ // for sort_stack.IsEmpty() == false {
41
+ // j := sort_stack.Top().(int)
42
+ // sort_stack.Pop()
43
+ // i := sort_stack.Top().(int)
44
+ // sort_stack.Pop()
45
+ // k := partition(nums, i, j)
46
+ // if i < k - 1 {
47
+ // sort_stack.Push(i)
48
+ // sort_stack.Push(k-1)
49
+ // }
50
+ // if k + 1 < j {
51
+ // sort_stack.Push(k+1)
52
+ // sort_stack.Push(j)
53
+ // }
54
+ // }
55
+ //}
56
+
57
+ /***********************方法2***************************/
58
+ //// 栈中保存下次需要排序的子数组的开始位置和结束位置
59
+ //sort_stack := Stack.New()
60
+ //sort_stack.Push(0)
61
+ //sort_stack.Push(len(nums) - 1)
62
+ //
63
+ //// 栈非空
64
+ //for sort_stack.IsEmpty() == false {
65
+ // high := sort_stack.Top().(int)
66
+ // sort_stack.Pop()
67
+ // low := sort_stack.Top().(int)
68
+ // sort_stack.Pop()
69
+ // middle := partition(nums, low, high)
70
+ //
71
+ // // 右边子数组入栈
72
+ // if (middle + 1) < high {
73
+ // sort_stack.Push(middle + 1)
74
+ // sort_stack.Push(high)
75
+ // }
76
+ // // 左边数组入栈
77
+ // if low < (middle - 1) {
78
+ // sort_stack.Push(low)
79
+ // sort_stack.Push(middle - 1)
80
+ // }
81
+ //}
82
+
83
+ /***********************方法3***************************/
84
+ // 递归层数设置,栈中保存下次需要排序的子数组的开始位置和结束位置
85
+ var sort_stack = make ([]int , len (nums ) * 2 )
86
+ top := - 1
87
+ top ++
88
+ sort_stack [top ] = 0
89
+ top ++
90
+ sort_stack [top ] = len (nums ) - 1
91
+
92
+ // 栈非空
93
+ for top > 0 {
94
+ high := sort_stack [top ]
95
+ top --
96
+ low := sort_stack [top ]
97
+ top --
98
+ middle := partition (nums , low , high )
99
+
100
+ // 右边子数组入栈
101
+ if middle + 1 < high {
102
+ top ++
103
+ sort_stack [top ] = middle + 1
104
+ top ++
105
+ sort_stack [top ] = high
106
+ }
107
+ // 左边子数组入栈
108
+ if middle - 1 > low {
109
+ top ++
110
+ sort_stack [top ] = low
111
+ top ++
112
+ sort_stack [top ] = middle - 1
52
113
}
53
114
}
115
+
54
116
}
0 commit comments