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
package main

import (
"fmt"
"math/rand"
"sort"
"time"
)

var r = rand.New(rand.NewSource(time.Now().UnixNano()))

func getArray(size, maxValue int, flag bool) []int {
arr := make([]int, size)
nega := 0

if flag {
nega = -maxValue
}

for i := 0; i < size; i++ {
arr[i] = r.Intn(maxValue-nega) + nega
}

return arr
}

func isEqual(arr1, arr2 []int) bool {
if len(arr1) != len(arr2) {
return false
}
for i := range arr1 {
if arr1[i] != arr2[i] {
return false
}
}
return true
}

func bubbleSort(arr []int) {
n := len(arr)
for i := n - 1; i > 0; i-- {
for j := 0; j < i; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
}

func selectSort(arr []int) {
n := len(arr)
for i := 0; i < n-1; i++ {
min := i
for j := i + 1; j < n; j++ {
if arr[j] < arr[min] {
min = j
}
}
arr[i], arr[min] = arr[min], arr[i]
}
}

func quickSort(arr []int, left, right int) {
if left >= right {
return
}
i, j := left, right
p := arr[i]
for i < j {
for i < j && arr[j] >= p {
j--
}
arr[i] = arr[j]
for i < j && arr[i] <= p {
i++
}
arr[j] = arr[i]
}
arr[i] = p
quickSort(arr, left, i-1)
quickSort(arr, i+1, right)
}

func insertSort(arr []int) {
n := len(arr)
for i := 0; i < n-1; i++ {
for j := i; j >= 0 && arr[j] > arr[j+1]; j-- {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}

func main() {
size, maxValue, testTime := 100, 100, 100000
flag := true
for i := 0; i < testTime; i++ {
arr := getArray(size, maxValue, false)
arr1 := make([]int, size)
copy(arr1, arr)

insertSort(arr)

sort.Ints(arr1)
flag = isEqual(arr, arr1)
if !flag {
break
}
}
fmt.Println(flag)
}