-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path0912.go
110 lines (83 loc) · 1.78 KB
/
0912.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
package main
func sortArray(nums []int) []int {
//return bubble(nums)
//return mergeSort(nums)
return quickSort(nums)
}
func quickSort(nums []int) []int {
if len(nums) == 1 {
return nums
}
quickSortReal(nums, 0, len(nums)-1)
return nums
}
func quickSortReal(nums []int, left int, right int) {
if left < right {
index := getIndex(nums, left, right)
quickSortReal(nums, left, index-1)
quickSortReal(nums, index+1, right)
}
}
func getIndex(nums []int, left int, right int) int {
provt := nums[left]
for left < right {
for left < right && nums[right] > provt {
right--
}
if left < right {
nums[left] = nums[right]
left++
}
for left < right && nums[left] < provt {
left++
}
if left < right {
nums[right] = nums[left]
right--
}
}
nums[left] = provt
return left
}
func swap(nums []int, left int, right int) {
tmp := nums[left]
nums[left] = nums[right]
nums[right] = tmp
}
func mergeSort(nums []int) []int {
if len(nums) == 1 {
return nums
}
leftSortPart := mergeSort(nums[:len(nums)/2])
rightSortPart := mergeSort(nums[len(nums)/2:])
var result []int
lIndex := 0
rIndex := 0
for lIndex < len(leftSortPart) && rIndex < len(rightSortPart) {
if leftSortPart[lIndex] < rightSortPart[rIndex] {
result = append(result, leftSortPart[lIndex])
lIndex++
} else {
result = append(result, rightSortPart[rIndex])
rIndex++
}
}
if lIndex == len(leftSortPart) {
return append(result, rightSortPart[rIndex:]...)
} else if rIndex == len(rightSortPart) {
return append(result, leftSortPart[lIndex:]...)
}
return result
}
func bubble(nums []int) []int {
for i := range nums {
for j := i + 1; j < len(nums); j++ {
if nums[i] > nums[j] {
tmp := nums[i]
nums[i] = nums[j]
nums[j] = tmp
}
}
}
return nums
}