Skip to content

Commit 25acf58

Browse files
committed
Merge branch 'master' into 18_hashtable
2 parents 865f2d0 + 6b50ac0 commit 25acf58

File tree

84 files changed

+9252
-414
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+9252
-414
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,6 @@ hs_err_pid*
2525
# editor files
2626
.vscode
2727
.*.swp
28+
29+
# WebStorm
30+
.idea/

c-cpp/15_bsearch/bsearch_c/sqrt.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*************************************************************************
2+
> File Name: sqrt.c
3+
> Author: jinshaohui
4+
5+
> Time: 18-10-31
6+
> Desc:
7+
************************************************************************/
8+
#include<stdio.h>
9+
#include<string.h>
10+
#include<stdlib.h>
11+
#include<assert.h>
12+
13+
14+
/*求解精度设置*/
15+
#define E 0.000001
16+
double mybsearch(double num)
17+
{
18+
double start = 1.0;
19+
double end = num;
20+
double mid = 0.0;
21+
while(1)
22+
{
23+
mid = (start + end)/2;
24+
if(((mid*mid - num) <= E) && ((mid*mid - num) >= -E))
25+
{
26+
return mid;
27+
}
28+
29+
if ((mid*mid - num) > E)
30+
{
31+
end = mid;
32+
}
33+
else
34+
{
35+
start = mid;
36+
}
37+
}
38+
39+
return 0;
40+
}
41+
42+
43+
int main()
44+
{
45+
double num = 0.0;
46+
47+
/*这里需要注意:double的输入方式*/
48+
scanf("%lf",&num);
49+
printf("\r\n num %lf的平方根是%lf",num,mybsearch(num));
50+
51+
return 0;
52+
}
53+

c-cpp/16_bsearch/bsearch.c

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
/*************************************************************************
2+
> File Name: bsearch.c
3+
> Author: jinshaohui
4+
5+
> Time: 18-10-21
6+
> Desc:
7+
************************************************************************/
8+
#include<stdio.h>
9+
#include<stdlib.h>
10+
#include<assert.h>
11+
12+
/*二分查找算法的变形问题
13+
*1、查找第一个等于给定数值的元素
14+
*2、查找最后一个等于给定数值的元素
15+
*3、查找第一个大于等于给定数值的元素
16+
*4、查找第一个小于等于给定数值的元素
17+
* */
18+
19+
20+
/*1、查找第一个等于给定数值的元素*/
21+
int mybsearch_1(int a[],int size,int value)
22+
{
23+
int mid = 0;
24+
int left = 0;
25+
int right = size - 1;
26+
27+
while(left <= right)
28+
{
29+
/*防止size数量太大是,(left + right)数据翻转,导致问题*/
30+
mid = left + ((right - left)>>1);
31+
32+
if (a[mid] < value)
33+
{
34+
left = mid + 1;
35+
}
36+
else if (a[mid] > value)
37+
{
38+
right = mid - 1;
39+
}
40+
else
41+
{
42+
if ((mid == 0) || (a[mid - 1] != value))
43+
{
44+
return mid;
45+
}
46+
else
47+
{
48+
right = mid - 1;
49+
}
50+
}
51+
}
52+
53+
return -1;
54+
}
55+
56+
/*2、查找最后一个等于给定数值的元素*/
57+
int mybsearch_2(int a[],int size,int value)
58+
{
59+
int mid = 0;
60+
int left = 0;
61+
int right = size - 1;
62+
63+
while(left <= right)
64+
{
65+
/*防止size数量太大是,(left + right)数据翻转,导致问题*/
66+
mid = left + ((right - left)>>1);
67+
68+
if (a[mid] < value)
69+
{
70+
left = mid + 1;
71+
}
72+
else if (a[mid] > value)
73+
{
74+
right = mid - 1;
75+
}
76+
else
77+
{
78+
if ((mid == (size - 1)) || (a[mid + 1] != value))
79+
{
80+
return mid;
81+
}
82+
else
83+
{
84+
left = mid + 1;
85+
}
86+
}
87+
}
88+
89+
return -1;
90+
}
91+
/*3、查找第一个大于等于给定数值的元素*/
92+
int mybsearch_3(int a[],int size,int value)
93+
{
94+
int mid = 0;
95+
int left = 0;
96+
int right = size - 1;
97+
98+
while(left <= right)
99+
{
100+
/*防止size数量太大是,(left + right)数据翻转,导致问题*/
101+
mid = left + ((right - left)>>1);
102+
103+
if (a[mid] < value)
104+
{
105+
left = mid + 1;
106+
}
107+
else
108+
{
109+
/*a[mid] >= value 当mid==0 或者a[mid-1] > value 说明是第一个大于等于value*/
110+
if ((mid == 0) || (a[mid - 1] < value))
111+
{
112+
return mid;
113+
}
114+
else
115+
{
116+
right = mid - 1;
117+
}
118+
}
119+
}
120+
121+
return -1;
122+
}
123+
124+
/*4、查找第一个小于等于给定数值的元素*/
125+
int mybsearch_4(int a[],int size,int value)
126+
{
127+
int mid = 0;
128+
int left = 0;
129+
int right = size - 1;
130+
131+
while(left <= right)
132+
{
133+
/*防止size数量太大是,(left + right)数据翻转,导致问题*/
134+
mid = left + ((right - left)>>1);
135+
136+
if (a[mid] > value)
137+
{
138+
right = mid - 1;
139+
}
140+
else
141+
{
142+
/*a[mid] <= value 时,当前mid == size -1 数组中最大的数值;
143+
* 或者a[mid + 1] 大于vlaue,就是mid就第一个小于等于value*/
144+
if ((mid == (size - 1)) || (a[mid + 1] > value))
145+
{
146+
return mid;
147+
}
148+
else
149+
{
150+
left = mid + 1;
151+
}
152+
}
153+
}
154+
155+
return -1;
156+
}
157+
int main()
158+
{
159+
int a[10] = {5,6,6,9,10,11,11,22,33,33};
160+
int data = 0;
161+
int i = 0;
162+
int res =0;
163+
164+
printf("\r\n");
165+
for(i = 0; i < 10 ; i++)
166+
{
167+
printf("%d ",a[i]);
168+
}
169+
printf("\r\n");
170+
printf("\r\n输入一个整数");
171+
scanf("%d",&data);
172+
res = mybsearch_1(a,10,data);
173+
printf("第一个等于data[%d],下标是%d",data,res);
174+
175+
printf("\r\n输入一个整数");
176+
scanf("%d",&data);
177+
res = mybsearch_2(a,10,data);
178+
printf("最后一个等于data[%d],下标是%d",data,res);
179+
180+
printf("\r\n输入一个整数");
181+
scanf("%d",&data);
182+
res = mybsearch_2(a,10,data);
183+
printf("第一个大于等于data[%d],下标是%d",data,res);
184+
185+
printf("\r\n输入一个整数");
186+
scanf("%d",&data);
187+
res = mybsearch_2(a,10,data);
188+
printf("第一个小等于data[%d],下标是%d",data,res);
189+
return;
190+
}

0 commit comments

Comments
 (0)