-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
240 lines (217 loc) · 5.1 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
package main
import (
"fmt"
"os"
)
func main() {
arr := []int{10, 9, 5, 7, 3, 5, 2, 9, 4, 6, 10}
res := SelectSortByFury(arr)// 选择排序
//res := InsertionSort(arr) // 插入排序
//res := InsertSortByFury(arr) // 插入排序优化版
//res := BubbleSortByFury(arr) // 冒泡排序
//res := MergeSort(arr) // 归并排序
//res := QuickSort(arr) // 快速排序
fmt.Print(res)
os.Open()
}
//选择排序
//思路:每次循环找出最小的数,跟数组第一个数交换顺序,接下来在剩余的数里重复以上逻辑
func SelectionSort(arr []int) []int {
length := len(arr)
for i := 0; i < length; i++ {
min := i
for j := i + 1; j < length; j++ {
//只要找到比要比较的值小的值,就更新min的位置,循环一圈就能找到最小的值的位置
if arr[j] < arr[min] {
min = j
}
}
//交换最小值与这一次循环最左边值的位置
arr[i], arr[min] = arr[min], arr[i]
}
return arr
}
func SelectSortByFury(arr []int) []int {
length := len(arr)
for i := 0; i < length; i++ {
min := i
for j := i+1; j < length; j++ {
if arr[min] > arr[j] {
min = j
}
}
arr[i], arr[min] = arr[min], arr[i]
}
return arr
}
//插入排序,类似扑克牌起牌,将未排序的数据插入到已排序的数据中
func InsertionSort(arr []int) []int {
length := len(arr)
for i := 1; i < length; i++ {
for j := i; j > 0; j-- {
//如果要比较的数据小于左边的数据,则交换位置
if arr[j-1] > arr[j] {
arr[j], arr[j-1] = arr[j-1], arr[j]
} else {
break
}
}
}
return arr
}
func InsertSortByFury(arr []int) []int {
length := len(arr)
for i := 1; i < length; i++ {
for j := i; j > 0 ; j-- {
if arr[j-1] > arr[j] {
arr[j-1], arr[j] = arr[j], arr[j-1]
} else {
break
}
}
}
return arr
}
//插入排序优化版,用赋值代替交换操作
func InsertionSortPro(arr []int) []int {
length := len(arr)
for i := 1; i < length; i++ {
temp := arr[i] //复制一份待比较的值
var j int
for j = i; j > 0; j-- {
//如果左边数据大于待比较待值,则将左边数据赋值给右边的(往右挪一位),否则停止比较
if arr[j-1] > temp {
arr[j] = arr[j-1]
} else {
break
}
}
arr[j] = temp //找到合适的位置了(左边不再比该值大),将刚刚待比较的值赋值给这个元素
}
return arr
}
//冒泡排序,每次和相邻的元素比较,内层每循环一次会把最大的循环到最后
func BubbleSort(arr []int) []int {
length := len(arr)
for i := 0; i < length; i++ {
//j < length -i -1 原因:每循环一次,最后一位数已排好,不用再比
for j := 0; j < length-i-1; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
return arr
}
func BubbleSortByFury(arr []int) []int {
length := len(arr)
for i := 0; i < length - 1; i++ {
over := false
for j := 0; j < length - i - 1; j++ {
if arr[j] > arr[j+1] {
over = true
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
if !over {
break
}
}
return arr
}
//冒泡排序优化版,如果某次循环发现没有需要交换的元素,则认为整个排序已完成
func BubbleSortPro(arr []int) []int {
length := len(arr)
for i := 0; i < length; i++ {
over := false
for j := 0; j < length-i-1; j++ {
if arr[j] > arr[j+1] {
over = true
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
if over == false {
break
}
}
return arr
}
//归并排序
func MergeSort(arr []int) []int {
length := len(arr)
if length < 2 {
return arr
}
i := length / 2
left := MergeSort(arr[0:i])
right := MergeSort(arr[i:])
res := merge(left, right)
return res
}
//合并数组
func merge(left, right []int) []int {
result := make([]int, 0)
m, n := 0, 0
l, r := len(left), len(right)
//比较两个数组,谁小把元素值添加到结果集内
for m < l && n < r {
if left[m] > right[n] {
result = append(result, right[n])
n++
} else {
result = append(result, left[m])
m++
}
}
//如果有一个数组比完了,另一个数组还有元素的情况,则将剩余元素添加到结果集内
result = append(result, right[n:]...)
result = append(result, left[m:]...)
return result
}
//快排,以第一个值为标准,小于此值的放左边,大于此值放右边,将第一个值放中间,在分好的数组里如此往复
func QuickSort(arr []int) []int {
length := len(arr)
if length <= 1 {
return arr
}
p := 0
res := quickSort(arr, p, length-1)
return res
}
func QuickSortByFury(arr []int) []int {
length := len(arr)
if length <= 1 {
return arr
}
p := 0
return quickSortByFury(arr, p, length-1)
}
//递归方法
func quickSort(arr []int, p int, r int) []int {
if p >= r {
return arr
}
q := partition(arr, p, r)
quickSort(arr, p, q-1)
quickSort(arr, q+1, r)
return arr
}
func quickSortByFury(arr []int, p int, r int) []int {
if p >= r {
return arr
}
return arr
}
//排序并返回pivot
func partition(arr []int, p int, r int) int {
k := arr[p]
j := p
for i := p; i < r; i++ {
if k > arr[i] {
arr[i], arr[j] = arr[j], arr[i]
j++
}
}
arr[r], arr[j] = arr[j], arr[r]
return j
}