Skip to content

Commit 624ef90

Browse files
committed
2017.4.20
Some search algorithm
1 parent ff19469 commit 624ef90

File tree

5 files changed

+138
-0
lines changed

5 files changed

+138
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
}

0 commit comments

Comments
 (0)