66
77package Quick_Sort
88
9- import "Golang_Algorithm/Data_Structure/Stack"
9+ // import "Golang_Algorithm/Data_Structure/Stack"
1010
1111func partition (nums []int , left int , right int ) int {
1212 // 选第一个元素作为枢纽元
@@ -29,26 +29,88 @@ func partition(nums []int, left int, right int) int {
2929}
3030
3131func 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
52113 }
53114 }
115+
54116}
0 commit comments