Skip to content

Commit 418c4d1

Browse files
committed
2017.4.19
Update quick_sort_unrecurse
1 parent d0a85e1 commit 418c4d1

File tree

2 files changed

+110
-48
lines changed

2 files changed

+110
-48
lines changed

Algorithm/Sort/Quick_Sort/quick_sort_unrecurse.go

Lines changed: 83 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
package Quick_Sort
88

9-
import "Golang_Algorithm/Data_Structure/Stack"
9+
//import "Golang_Algorithm/Data_Structure/Stack"
1010

1111
func partition(nums []int, left int, right int) int {
1212
// 选第一个元素作为枢纽元
@@ -29,26 +29,88 @@ func partition(nums []int, left int, right int) int {
2929
}
3030

3131
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
52113
}
53114
}
115+
54116
}

Algorithm/Sort/Test/test.txt

Lines changed: 27 additions & 27 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)