-
Notifications
You must be signed in to change notification settings - Fork 29
/
bianry_search更多扩展.cpp
143 lines (118 loc) · 2.8 KB
/
bianry_search更多扩展.cpp
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// 以下是二分查找的各种变种
// 查找第一个与key相等的值、最后一个与key相等的值、第一个等于或大于key的值、
// 第一个大于key的值、最后一个小于或等于key的值、最后一个小于key的值
// 参考链接:http://blog.chinaunix.net/uid-1844931-id-3337784.html
#include <iostream>
using namespace std;
int FindFirstEqual(int a[], int length, int key);
int FindLastEqual(int a[], int length, int key);
int FindFirstEqualLarger(int a[], int length, int key);
int FindFirstLarger(int a[], int length, int key);
int FindLastEqualSmaller(int a[], int length, int key);
int FindLastSmaller(int a[], int length, int key);
int main(void)
{
int a1[5] = { 1, 2, 2, 3, 4 };
int a2[5] = { 2, 2, 3, 4, 5 };
int a3[5] = { 1, 2, 3, 4, 4 };
cout << FindLastSmaller(a1, 5, 2) << endl;
cout << FindLastSmaller(a2, 5, 2) << endl;
cout << FindLastSmaller(a3, 5, 4) << endl;
cout << FindLastSmaller(a1, 5, -3) << endl;
cout << FindLastSmaller(a1, 5, 12) << endl;
return 0;
}
/// 查找第一个与key相等的值
int FindFirstEqual(int a[], int length, int key)
{
int left = 0;
int right = length - 1;
while (left <= right)
{
int mid = left + ((right - left) >> 1);
if (key <= a[mid])
right = mid - 1;
else
left = mid + 1;
}
if (left < length && a[left] == key)
return left;
return -1;
}
/// 查找最后一个与key相等的值
int FindLastEqual(int a[], int length, int key)
{
int left = 0;
int right = length - 1;
while (left <= right)
{
int mid = left + ((right - left) >> 1);
if (key >= a[mid])
left = mid + 1;
else
right = mid - 1;
}
if (right >= 0 && a[right] == key)
return right;
return -1;
}
/// 查找第一个等于或大于key的值
int FindFirstEqualLarger(int a[], int length, int key)
{
int left = 0;
int right = length - 1;
while (left <= right)
{
int mid = left + ((right - left) >> 1);
if (key <= a[mid])
right = mid - 1;
else
left = mid + 1;
}
return left;
}
/// 查找第一个大于key的值
int FindFirstLarger(int a[], int length, int key)
{
int left = 0;
int right = length - 1;
while (left <= right)
{
int mid = left + ((right - left) >> 1);
if (key >= a[mid])
left = mid + 1;
else
right = mid - 1;
}
return left;
}
/// 查找最后一个等于或小于key的值
int FindLastEqualSmaller(int a[], int length, int key)
{
int left = 0;
int right = length - 1;
while (left <= right)
{
int mid = left + ((right - left) >> 1);
if (key >= a[mid])
left = mid + 1;
else
right = mid - 1;
}
return right;
}
/// 查找最后一个小于key的值
int FindLastSmaller(int a[], int length, int key)
{
int left = 0;
int right = length - 1;
while (left <= right)
{
int mid = left + ((right - left) >> 1);
if (key > a[mid])
left = mid + 1;
else
right = mid - 1;
}
return right;
}