Skip to content

Commit 7c89b35

Browse files
committed
grpc and 排序
1 parent 07e980c commit 7c89b35

File tree

12 files changed

+863
-1
lines changed

12 files changed

+863
-1
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
+ [mysql](https://github.com/GitTsewell/learning/blob/master/mysql/readme.md)
44
+ [redis](https://github.com/GitTsewell/learning/blob/master/redis/readme.md)
5-
+ [golang](https://github.com/GitTsewell/learning/blob/master/golang/readme.md)
5+
+ [golang](https://github.com/GitTsewell/learning/blob/master/golang/readme.md)
6+
+ [grpc](https://github.com/GitTsewell/learning/blob/master/grpc/readme.md)

algorithm/algorithm.go

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
package algorithm
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
// 冒泡排序
8+
// 从第一个原始开始 两两比较 如果第一个比第二个大就交换他们的位置
9+
// O(n^2)
10+
func maopao(buf []int) {
11+
times := 0
12+
for i := 0; i < len(buf)-1; i++ {
13+
flag := false
14+
for j := 1; j < len(buf)-i; j++ {
15+
if buf[j-1] > buf[j] {
16+
times++
17+
buf[j-1], buf[j] = buf[j], buf[j-1]
18+
flag = true
19+
}
20+
}
21+
if !flag {
22+
break
23+
}
24+
}
25+
fmt.Println("maopao times: ", times)
26+
}
27+
28+
// 选择排序
29+
// 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
30+
// 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
31+
// 重复第二步,直到所有元素均排序完毕。
32+
// O(n^2)
33+
func xuanze(buf []int) {
34+
times := 0
35+
for i := 0; i < len(buf)-1; i++ {
36+
min := i
37+
for j := i; j < len(buf); j++ {
38+
times++
39+
if buf[min] > buf[j] {
40+
min = j
41+
}
42+
}
43+
if min != i {
44+
buf[min], buf[i] = buf[i], buf[min]
45+
}
46+
}
47+
fmt.Println("xuanze times: ", times)
48+
}
49+
50+
// 插入排序
51+
// 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
52+
// 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置
53+
// O(n^2)
54+
func charu(buf []int) {
55+
times := 0
56+
for i := 1; i < len(buf); i++ {
57+
for j := i; j > 0; j-- {
58+
if buf[j] < buf[j-1] {
59+
times++
60+
buf[j-1], buf[j] = buf[j], buf[j-1]
61+
} else {
62+
break
63+
}
64+
}
65+
}
66+
fmt.Println("charu times: ", times)
67+
}
68+
69+
// 希尔排序
70+
// 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序
71+
// // O(n^1.3)
72+
func xier(buf []int) {
73+
times := 0
74+
tmp := 0
75+
length := len(buf)
76+
incre := length
77+
// fmt.Println("buf: ", buf)
78+
for {
79+
incre /= 2
80+
for k := 0; k < incre; k++ { //根据增量分为若干子序列
81+
for i := k + incre; i < length; i += incre {
82+
for j := i; j > k; j -= incre {
83+
// fmt.Println("j: ", j, " data: ", buf[j], " j-incre: ", j-incre, " data: ", buf[j-incre])
84+
times++
85+
if buf[j] < buf[j-incre] {
86+
tmp = buf[j-incre]
87+
buf[j-incre] = buf[j]
88+
buf[j] = tmp
89+
} else {
90+
break
91+
}
92+
}
93+
// fmt.Println("middle: ", buf)
94+
}
95+
// fmt.Println("outer: ", buf)
96+
}
97+
// fmt.Println("outer outer: ", buf, " incre: ", incre)
98+
99+
if incre == 1 {
100+
break
101+
}
102+
}
103+
// fmt.Println("after: ", buf)
104+
fmt.Println("xier times: ", times)
105+
}
106+
107+
// 快速排序
108+
// 从数列中挑出一个元素,称为 "基准"(pivot);
109+
// 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
110+
// 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
111+
func kuaisu(buf []int) {
112+
kuai(buf, 0, len(buf)-1)
113+
}
114+
115+
func kuai(a []int, l, r int) {
116+
if l >= r {
117+
return
118+
}
119+
i, j, key := l, r, a[l] //选择第一个数为key
120+
for i < j {
121+
for i < j && a[j] > key { //从右向左找第一个小于key的值
122+
j--
123+
}
124+
if i < j {
125+
a[i] = a[j]
126+
i++
127+
}
128+
for i < j && a[i] < key { //从左向右找第一个大于key的值
129+
i++
130+
}
131+
if i < j {
132+
a[j] = a[i]
133+
j--
134+
}
135+
}
136+
//i == j
137+
a[i] = key
138+
kuai(a, l, i-1)
139+
kuai(a, i+1, r)
140+
}
141+
142+
//归并排序
143+
func guibing(buf []int) {
144+
tmp := make([]int, len(buf))
145+
merge_sort(buf, 0, len(buf)-1, tmp)
146+
}
147+
148+
func merge_sort(a []int, first, last int, tmp []int) {
149+
if first < last {
150+
middle := (first + last) / 2
151+
merge_sort(a, first, middle, tmp) //左半部分排好序
152+
merge_sort(a, middle+1, last, tmp) //右半部分排好序
153+
mergeArray(a, first, middle, last, tmp) //合并左右部分
154+
}
155+
}
156+
157+
func mergeArray(a []int, first, middle, end int, tmp []int) {
158+
// fmt.Printf("mergeArray a: %v, first: %v, middle: %v, end: %v, tmp: %v\n",
159+
// a, first, middle, end, tmp)
160+
i, m, j, n, k := first, middle, middle+1, end, 0
161+
for i <= m && j <= n {
162+
if a[i] <= a[j] {
163+
tmp[k] = a[i]
164+
k++
165+
i++
166+
} else {
167+
tmp[k] = a[j]
168+
k++
169+
j++
170+
}
171+
}
172+
for i <= m {
173+
tmp[k] = a[i]
174+
k++
175+
i++
176+
}
177+
for j <= n {
178+
tmp[k] = a[j]
179+
k++
180+
j++
181+
}
182+
183+
for ii := 0; ii < k; ii++ {
184+
a[first+ii] = tmp[ii]
185+
}
186+
// fmt.Printf("sort: buf: %v\n", a)
187+
}
188+
189+
// 堆排序
190+
func duipai(buf []int) {
191+
temp, n := 0, len(buf)
192+
193+
for i := (n - 1) / 2; i >= 0; i-- {
194+
MinHeapFixdown(buf, i, n)
195+
}
196+
197+
for i := n - 1; i > 0; i-- {
198+
temp = buf[0]
199+
buf[0] = buf[i]
200+
buf[i] = temp
201+
MinHeapFixdown(buf, 0, i)
202+
}
203+
}
204+
205+
func MinHeapFixdown(a []int, i, n int) {
206+
j, temp := 2*i+1, 0
207+
for j < n {
208+
if j+1 < n && a[j+1] < a[j] {
209+
j++
210+
}
211+
212+
if a[i] <= a[j] {
213+
break
214+
}
215+
216+
temp = a[i]
217+
a[i] = a[j]
218+
a[j] = temp
219+
220+
i = j
221+
j = 2*i + 1
222+
}
223+
}

algorithm/algorithm_test.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package algorithm
2+
3+
import (
4+
"fmt"
5+
"math/rand"
6+
"testing"
7+
"time"
8+
)
9+
10+
const (
11+
num = 100000
12+
rangeNum = 100000
13+
)
14+
15+
// 生成随机切片
16+
func makeRandArr() []int {
17+
randSeed := rand.New(rand.NewSource(time.Now().Unix() + time.Now().UnixNano()))
18+
var buf []int
19+
for i := 0; i < num; i++ {
20+
buf = append(buf, randSeed.Intn(rangeNum))
21+
}
22+
return buf
23+
}
24+
25+
// 冒泡
26+
func TestMaopao(t *testing.T) {
27+
buf := makeRandArr()
28+
ti := time.Now()
29+
maopao(buf)
30+
fmt.Println(buf)
31+
fmt.Println(time.Since(ti))
32+
}
33+
34+
// 选择
35+
func TestXuanze(t *testing.T) {
36+
buf := makeRandArr()
37+
ti := time.Now()
38+
xuanze(buf)
39+
fmt.Println(buf)
40+
fmt.Println(time.Since(ti))
41+
}
42+
43+
// 插入
44+
func TestCharu(t *testing.T) {
45+
buf := makeRandArr()
46+
ti := time.Now()
47+
charu(buf)
48+
fmt.Println(buf)
49+
fmt.Println(time.Since(ti))
50+
}
51+
52+
// 希尔
53+
func TestXier(t *testing.T) {
54+
buf := makeRandArr()
55+
ti := time.Now()
56+
xier(buf)
57+
fmt.Println(buf)
58+
fmt.Println(time.Since(ti))
59+
}
60+
61+
// 快速
62+
func TestKuaisu(t *testing.T) {
63+
buf := makeRandArr()
64+
ti := time.Now()
65+
kuaisu(buf)
66+
fmt.Println(buf)
67+
fmt.Println(time.Since(ti))
68+
}
69+
70+
// 归并
71+
func TestGuibing(t *testing.T) {
72+
buf := makeRandArr()
73+
ti := time.Now()
74+
guibing(buf)
75+
fmt.Println(buf)
76+
fmt.Println(time.Since(ti))
77+
}
78+
79+
// 堆排
80+
func TestDuipai(t *testing.T) {
81+
buf := makeRandArr()
82+
ti := time.Now()
83+
duipai(buf)
84+
fmt.Println(buf)
85+
fmt.Println(time.Since(ti))
86+
}

go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
module learning
22

33
go 1.13
4+
5+
require (
6+
github.com/golang/protobuf v1.3.3
7+
google.golang.org/grpc v1.29.1
8+
)

go.sum

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
2+
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3+
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
4+
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
5+
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
6+
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
7+
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
8+
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
9+
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
10+
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
11+
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
12+
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
13+
github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
14+
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
15+
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
16+
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
17+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
18+
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
19+
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
20+
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
21+
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
22+
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
23+
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
24+
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
25+
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
26+
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
27+
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
28+
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
29+
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
30+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
31+
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
32+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
33+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
34+
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
35+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
36+
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
37+
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
38+
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
39+
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
40+
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
41+
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
42+
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
43+
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
44+
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
45+
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
46+
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
47+
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
48+
google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4=
49+
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
50+
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
51+
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

0 commit comments

Comments
 (0)