File tree 5 files changed +138
-0
lines changed 5 files changed +138
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * Author: Juntaran
3
+ * Email: Jacinthmail@gmail.com
4
+ * Date: 2017/4/20 14:15
5
+ */
6
+
7
+ package Binary_Search
8
+
9
+ // 二分查找首先要数组有序
10
+ func Binary_Search (nums []int , key int ) int {
11
+ left , right := 0 , len (nums )- 1
12
+ for left <= right {
13
+ middle := (right - left ) >> 1 + left
14
+ if key < nums [middle ] {
15
+ right = middle - 1
16
+ } else if key > nums [middle ] {
17
+ left = middle + 1
18
+ } else {
19
+ return middle
20
+ }
21
+ }
22
+ return - 1
23
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ * Author: Juntaran
3
+ * Email: Jacinthmail@gmail.com
4
+ * Date: 2017/4/20 14:33
5
+ */
6
+
7
+ package Fibonacci_Search
8
+
9
+ // 斐波那契查找
10
+ func Fibonacci_Search (nums []int , key int ) int {
11
+ // 斐波那契数列
12
+ var Fibonacci [1000 ]int
13
+ Fibonacci [0 ] = 0
14
+ Fibonacci [1 ] = 1
15
+ for i := 2 ; i < 1000 ; i ++ {
16
+ Fibonacci [i ] = Fibonacci [i - 1 ] + Fibonacci [i - 2 ]
17
+ }
18
+ left , right := 0 , len (nums )- 1
19
+ k := 0
20
+ // 计算n位于斐波那契数列的位置
21
+ for len (nums ) > Fibonacci [k ] - 1 {
22
+ k ++
23
+ }
24
+ // 扩展nums到Fibonacci[k]-1的长度
25
+ var temp = new ([Fibonacci [k ]- 1 ]int )
26
+ for i := 0 ; i < len (nums ); i ++ {
27
+ temp [i ] = nums [i ]
28
+ }
29
+ // 填充剩余部分
30
+ for i := len (nums ); i < Fibonacci [k ]- 1 ; i ++ {
31
+ temp [i ] = nums [len (nums ) - 1 ]
32
+ }
33
+ for left <= right {
34
+ middle := left + Fibonacci [k - 1 ] - 1
35
+ if key < temp [middle ] {
36
+ right = middle - 1
37
+ // 斐波那契数列下标-1
38
+ k = k - 1
39
+ } else if key > temp [middle ] {
40
+ left = middle + 1
41
+ // 斐波那契数列下标-2
42
+ k = k - 2
43
+ } else {
44
+ if middle < len (nums ) {
45
+ return middle
46
+ } else {
47
+ return len (nums ) - 1
48
+ }
49
+ }
50
+ }
51
+ return - 1
52
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ * Author: Juntaran
3
+ * Email: Jacinthmail@gmail.com
4
+ * Date: 2017/4/20 14:29
5
+ */
6
+
7
+ package Insert_Search
8
+
9
+ // 插值查找
10
+ func Insert_Search (nums []int , key int ) int {
11
+ left , right := 0 , len (nums )
12
+ for left <= right {
13
+ // 差值查找只在middle的取值和二分不同
14
+ middle := left + (right - left ) * (key - nums [left ]) / (nums [right ] - nums [left ])
15
+ if key < nums [middle ] {
16
+ right = middle - 1
17
+ } else if key > nums [middle ] {
18
+ left = middle + 1
19
+ } else {
20
+ return middle
21
+ }
22
+ }
23
+ return - 1
24
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ * Author: Juntaran
3
+ * Email: Jacinthmail@gmail.com
4
+ * Date: 2017/4/20 14:22
5
+ */
6
+
7
+ package Sequence_Search
8
+
9
+ func Sequence_Search (nums []int , key int ) int {
10
+ for i := 0 ; i < len (nums ); i ++ {
11
+ if nums [i ] == key {
12
+ return i
13
+ }
14
+ }
15
+ return - 1
16
+ }
Original file line number Diff line number Diff line change
1
+ /**
2
+ * Author: Juntaran
3
+ * Email: Jacinthmail@gmail.com
4
+ * Date: 2017/4/20 14:24
5
+ */
6
+
7
+ package Sequence_Search
8
+
9
+ // 哨兵顺序查找
10
+ func Sequence_Search_2 (nums []int , key int ) int {
11
+ if nums [0 ] == key {
12
+ return 0
13
+ }
14
+ i := len (nums )
15
+ for nums [i ] != key && i != 0 {
16
+ i --
17
+ }
18
+ if i == 0 {
19
+ return - 1
20
+ } else {
21
+ return i
22
+ }
23
+ }
You can’t perform that action at this time.
0 commit comments