没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/release/download_crawler_static/89142562/bg1.jpg)
算法
二分查找
二分查找法通常用于在有序数组或有序列表中查找特定元素的位置。由于二分查找每次都
将查找范围减半,因此它的时间复杂度为 O(log n),相比于线性查找的 O(n) 更加高效。二
分查找法适用于以下情况:
总的来说,当需要在一个有序静态数据集中查找特定元素,并且查找频率适中时,二分查
找是一个高效的选择。
1. 有序数组或有序列表:二分查找要求被搜索的数据结构必须是有序的,这样才能通过
比较中间元素与目标值的大小关系来确定继续查找的方向。
2. 静态数据结构:二分查找适用于静态数据集,即数据集不会频繁地插入、删除或修改
元素。因为对数据集进行修改可能会破坏有序性,从而导致无法正确使用二分查找。
3. 查找频率适中:如果只需要对数据集进行一次查找,二分查找可能并不比线性查找更
高效。但如果需要多次查找同一个数据集,可以先进行排序,然后使用二分查找,这
样总体效率会更高。
版本一
c
l
a
ss
S
olution
{
pu
b
li
c
:
int
se
a
r
c
h
(
ve
c
tor
<
int
>
&
nums
,
int
t
a
rget
) {
int
left
=
0
;
int
right
=
nums
.
size
() -
1
;
定义
t
a
rget
在左闭右闭的区间里,
[
left
,
right
]
while
(
left
right
) {
当
left
right
,区间
[
left
,
right
]
依然有
效,所以用
int
middle
=
left
+
((
right
-
left
) /
2
);
防止溢出
等同于
(
left
+
right
)/
2
if
(
nums
[
middle
]
>
t
a
rget
) {
right
=
middle
-
1
;
t
a
rget
在左区间,所以
[
left
,
middle
-
1
]
}
else
if
(
nums
[
middle
]
<
t
a
rget
) {
left
=
middle
+
1
;
t
a
rget
在右区间,所以
[
middle
+
1
,
right
]
}
else
{
nums
[
middle
]
t
a
rget
return
middle
;
数组中找到目标值,直接返回下标
}
![](https://csdnimg.cn/release/download_crawler_static/89142562/bg2.jpg)
在这段代码中,在前两个if语句中没有直接返回值,是因为这两个条件分支表示的是在当前
区间内继续查找,而不是已经找到了目标值。具体来说:
只有当
nums
[
middle
]
t
a
rget
时,才表示已经找到了目标值,直接返回
middle
作为目
标值的下标。
如果数组中只有6个数,那么在使用二分查找时,
left
和
right
的初始值应该分别为
0
和
5
(数组下标从0开始)。整个查找过程如下:
如果数组中有7个数,那么在使用二分查找时,
left
和
right
的初始值应该分别为
0
和
6
(数组下标从0开始)。整个查找过程如下:
}
未找到目标值
return
-
1
;
}
};
1. 如果
nums
[
middle
]
>
t
a
rget
,表示目标值
t
a
rget
在当前中间值
middle
的左侧,因
此更新
right
=
middle
-
1
,继续在左侧区间
[
left
,
middle
-
1
]
中查找。
2. 如果
nums
[
middle
]
<
t
a
rget
,表示目标值
t
a
rget
在当前中间值
middle
的右侧,因
此更新
left
=
middle
+
1
,继续在右侧区间
[
middle
+
1
,
right
]
中查找。
1. 初始时,
left
=
0
,
right
=
5
,表示整个数组范围为
[
0
,
5
]
。
2. 计算中间位置
middle
=
(
left
+
right
) /
2
=
2
。
3. 如果
nums
[
middle
]
>
t
a
rget
,则更新
right
=
middle
-
1
=
1
,此时数组范围为
[
0
,
1
]
。
4. 如果
nums
[
middle
]
<
t
a
rget
,则更新
left
=
middle
+
1
=
3
,此时数组范围为
[
3
,
5
]
。
5. 继续以上步骤,直到
left
>
right
,表示查找结束,如果找到了目标值,返回目标
值的下标,否则返回
-
1
表示未找到。
1. 初始时,
left
=
0
,
right
=
6
,表示整个数组范围为
[
0
,
6
]
。
2. 计算中间位置
middle
=
(
left
+
right
) /
2
=
3
。
3. 如果
nums
[
middle
]
>
t
a
rget
,则更新
right
=
middle
-
1
=
2
,此时数组范围为
[
0
,
2
]
。
4. 如果
nums
[
middle
]
<
t
a
rget
,则更新
left
=
middle
+
1
=
4
,此时数组范围为
[
4
,
6
]
。
![](https://csdnimg.cn/release/download_crawler_static/89142562/bg3.jpg)
在这个例子中,数组的中间位置总是向下取整,例如
(
0
+
6
) /
2
=
3
,
6
/
2
=
3
,所
以中间位置是下标为
3
的元素。
快速排序
5. 继续以上步骤,直到
left
>
right
,表示查找结束,如果找到了目标值,返回目标
值的下标,否则返回
-
1
表示未找到。
快排写法千千万,
边界处理难又难,
大神算法背下来,
乐无边呀乐无边
#
in
c
lude
<
iostre
a
m
>
using
n
a
mesp
ac
e
std
;
c
onst
int
m
=
100000
+
10
;
int
a
rr
[
m
];
void
f
(
int
a
rr
[],
int
l
,
int
r
)
{
if
(
l
r
)
return
;
int
x
=
a
rr
[
l
+
r
1
];
int
i
=
l
-
1
;
int
j
=
r
+
1
;
while
(
i
<
j
)
{
while
(
a
rr
[
i
]
<
x
);
找到比
x
大的
while
(
a
rr
[
j
]
>
x
);
找到比
x
小的
if
(
i
<
j
)
sw
a
p
(
a
rr
[
i
],
a
rr
[
j
]);
这个地方不仅仅只是交换了
a
rr
你可以往后想一想
还有
i
j
的变化
}
f
(
a
rr
,
l
,
j
);
f
(
a
rr
,
j
+
1
,
r
);
}
int
m
a
in
()
{
int
n
;
c
in
n
;
for
(
int
i
=
0
;
i
<
n
;
i
)
{
c
in
a
rr
[
i
];
}
f
(
a
rr
,
0
,
n
-
1
);
![](https://csdnimg.cn/release/download_crawler_static/89142562/bg4.jpg)
这段代码实现了快速排序算法,对输入的数组进行排序。以下是对于输入序列
2
1
5
4
6
的排序过程:
for
(
int
i
=
0
;
i
<
n
;
i
)
{
c
out
a
rr
[
i
]
" ";
}
}
1. 初始时,数组
a
为
2
1
5
4
6
,
l
=
0
,
r
=
4
。
2. 第一次调用
qui
c
k
S
ort
(
a
,
0
,
4
)
:
进入
qui
c
k
S
ort
函数,
l
=
0
,
r
=
4
。
选取分界线
x
:中间数
5
。
划分过程:
i
向右移动,找到第一个大于等于
x
的数,此时
a
[
i
]
指向
5
。
j
向左移动,找到第一个小于等于
x
的数,此时
a
[
j
]
指向
4
。
交换
a
[
i
]
和
a
[
j
]
,数组变为
2
1
4
5
6
。
继续移动
i
和
j
,直到
i
j
。
此时划分结果为
2
1
4
5
6
,
j
=
2
。
对左部分调用
qui
c
k
S
ort
(
a
,
0
,
2
)
。
对右部分调用
qui
c
k
S
ort
(
a
,
3
,
4
)
。
3. 第二次调用
qui
c
k
S
ort
(
a
,
0
,
2
)
:
进入
qui
c
k
S
ort
函数,
l
=
0
,
r
=
2
。
选取分界线
x
:中间数
2
。
划分过程:
i
向右移动,找到第一个大于等于
x
的数,此时
a
[
i
]
指向
2
。
j
向左移动,找到第一个小于等于
x
的数,此时
a
[
j
]
指向
1
。
交换
a
[
i
]
和
a
[
j
]
,数组变为
1
2
4
5
6
。
继续移动
i
和
j
,直到
i
j
。
此时划分结果为
1
2
4
5
6
,
j
=
1
。
对左部分调用
qui
c
k
S
ort
(
a
,
0
,
1
)
,结束后,数组变为
1
2
4
5
6
。
4. 第三次调用
qui
c
k
S
ort
(
a
,
3
,
4
)
:
进入
qui
c
k
S
ort
函数,
l
=
3
,
r
=
4
。
选取分界线
x
:中间数
5
。
划分过程:
i
向右移动,找到第一个大于等于
x
的数,此时
a
[
i
]
指向
5
。
![](https://csdnimg.cn/release/download_crawler_static/89142562/bg5.jpg)
是的,这个
qui
c
k
S
ort
函数通过传入数组
a
的指针(数组名
a
在函数调用时会转换为指
向数组首元素的指针)可以直接修改数组的内容。这类似于通过传引用传递数组的方式。
在 C++ 中,数组名被隐式地转换为指向数组首元素的指针,因此在函数内部对数组元素的
修改会反映到原始数组上。
j
向左移动,找到第一个小于等于
x
的数,此时
a
[
j
]
指向
4
。
交换
a
[
i
]
和
a
[
j
]
,数组变为
1
2
4
5
6
。
继续移动
i
和
j
,直到
i
j
。
此时划分结果为
1
2
4
5
6
,
j
=
3
。
对左部分调用
qui
c
k
S
ort
(
a
,
3
,
3
)
,结束后,数组变为
1
2
4
5
6
。
5. 最终数组为排序后的结果:
1
2
4
5
6
。
在上面的代码中主要是利用了双指针,所谓的指针就是标记一些具体位置,一个指针正着出
发,一个指针倒着进行减减。
#
in
c
lude
<
iostre
a
m
>
using
n
a
mesp
ac
e
std
;
void
qui
c
ksort
(
int
a
rr
[],
int
left
,
int
right
)
{
if
(
left
right
)
return
;
int
i
=
left
+
1
;
int
j
=
left
+
1
;
int
pivot
=
a
rr
[
left
];
while
(
j
right
)
{
if
(
a
rr
[
j
]
pivot
)
{
交换
a
rr
[
i
]
和
a
rr
[
j
]
int
temp
=
a
rr
[
i
];
a
rr
[
i
]
=
a
rr
[
j
];
a
rr
[
j
]
=
temp
;
i
;
}
j
;
}
剩余44页未读,继续阅读
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
流星雨.又来临
- 粉丝: 156
- 资源: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 打包和分发Rust工具.pdf
- SQL中的CREATE LOGFILE GROUP 语句.pdf
- C语言-leetcode题解之第172题阶乘后的零.zip
- C语言-leetcode题解之第171题Excel列表序号.zip
- C语言-leetcode题解之第169题多数元素.zip
- ocr-图像识别资源ocr-图像识别资源
- 图像识别:基于Resnet50 + VGG16模型融合的人体细胞癌症分类模型实现-图像识别资源
- C语言-leetcode题解之第168题Excel列表名称.zip
- C语言-leetcode题解之第167题两数之和II-输入有序数组.zip
- C语言-leetcode题解之第166题分数到小数.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)