File tree Expand file tree Collapse file tree 5 files changed +138
-0
lines changed
Expand file tree Collapse file tree 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