根据给定文件的信息,我们可以总结出以下几个C++相关的知识点: ### C++经典案例解析 #### 1. 二分查找算法(Binary Search) 在提供的代码片段中,`bfind` 函数实现了一个基本的二分查找算法。该算法用于在一个有序数组中查找特定元素的位置。函数接受一个整型指针 `a`、数组长度 `len` 和要查找的值 `val`。 - **算法流程**: - 初始化两个指针 `l` 和 `r` 分别指向数组的起始位置和结束位置。 - 计算中间位置 `m`。 - 当左指针 `l` 和右指针 `r` 指向的位置不同时,进入循环: - 如果中间值大于目标值,则将右指针 `r` 移动到 `m` 的位置; - 如果中间值小于目标值,则将左指针 `l` 移动到 `m` 的位置; - 如果找到目标值则返回中间位置 `m`; - 如果循环结束后未找到目标值,则返回 `-1` 表示查找失败。 此算法的时间复杂度为 O(log n),适用于有序数组的查找操作。 #### 2. 子字符串计数算法 `count1` 函数实现了对给定字符串 `str` 中出现的子字符串 `s` 的次数进行计数的功能。 - **算法流程**: - 使用两个指针 `s1` 和 `s2` 分别遍历 `str` 和 `s`。 - 当 `str` 中的某个子串与 `s` 相等时,计数器 `count` 增加 1。 - 最终返回计数器的值。 此算法的时间复杂度为 O(n*m),其中 n 是 `str` 的长度,m 是 `s` 的长度。适用于简单的子串匹配场景。 #### 3. 字符串查找算法 `find` 函数用于查找一个字符串 `s2` 在另一个字符串 `s1` 中首次出现的位置。 - **算法流程**: - 遍历 `s1`,对于每个位置 i,检查 `s1` 从位置 i 开始的部分是否与 `s2` 匹配。 - 如果匹配成功,则返回该位置 i。 - 如果遍历完整个 `s1` 后仍未找到匹配项,则返回 -1 表示查找失败。 此算法的时间复杂度同样为 O(n*m),适用于简单的字符串查找任务。 #### 4. 快速排序算法 提供了快速排序算法的一个实现版本。通过递归的方式实现,包括 `partition` 和 `qsort` 函数。 - **算法流程**: - `partition` 函数用于选取一个基准值,并将其置于正确的位置,使得左侧的所有元素都比基准值小,右侧的所有元素都比基准值大。 - `qsort` 函数用于递归地对分区后的左右两部分分别进行快速排序。 - 整体时间复杂度为 O(n log n),适用于大规模数据集的排序操作。 #### 5. 冒泡排序算法 `buble` 函数实现了冒泡排序算法。 - **算法流程**: - 多次遍历数组,每次遍历时比较相邻的两个元素,如果它们的顺序错误就交换它们的位置。 - 整体时间复杂度为 O(n^2),适用于小规模或接近有序的数据集。 #### 6. 插入排序算法 `insertsort` 函数实现了插入排序算法。 - **算法流程**: - 将数组分为已排序部分和未排序部分。 - 每次从未排序部分取出一个元素,插入到已排序部分的适当位置。 - 时间复杂度为 O(n^2),适用于小规模数据集。 #### 7. 字符串比较算法 `strcmp11` 函数实现了字符串比较功能。 - **算法流程**: - 逐字符比较两个字符串,直到遇到不相同的字符或者到达字符串结尾。 - 返回值表示第一个字符串相对于第二个字符串的大小关系。 - 时间复杂度为 O(min(m, n)),其中 m 和 n 分别是两个字符串的长度。 #### 8. 字符串反转算法 `reverse` 函数用于反转字符串。 - **算法流程**: - 使用两个指针分别指向字符串的开头和结尾。 - 交换两个指针所指的字符,然后移动指针。 - 时间复杂度为 O(n),适用于字符串的反转操作。 #### 9. 单链表反转算法 `reserve` 函数用于反转单链表。 - **算法流程**: - 使用三个指针 `phead`、`p` 和 `p1` 来追踪当前节点、下一个节点以及下下个节点。 - 通过不断更新这些指针来完成链表的反转。 - 时间复杂度为 O(n),适用于单链表的反转操作。 以上这些经典案例覆盖了C++编程中的基础算法、数据结构以及字符串处理等内容,非常适合初学者学习和实践。通过这些案例的学习,可以帮助初学者更好地理解C++语言的核心概念和技术要点。
C/C++ 经典算法实例2009-03-04 19:11二分查找的代码.
int bfind(int* a,int len,int val)
{
int m = len/2;
int l = 0;
int r = len;
while(l!=m && r!= m)
{
if(a[m] > val)
{
r = m;
m = (m+l)/2;
}
else if(a[m] < val)
{
l = m;
m = (m+r)/2;
}
else
return m;
}
return -1; //没有找到
}
写出在母串中查找子串出现次数的代码.
int count1(char* str,char* s)
{
char* s1;
char* s2;
while(*str!='\0')
{
s1 = str;
s2 = s;
while(*s2 == *s1&&(*s2!='\0')&&(*s1!='0'))
{
s2++;
s1++;
}
if(*s2 == '\0')
count++;
str++;
}
return count;
}
查找第一个匹配子串位置,如果返回的是s1长度len1表示没有找到
size_t find(char* s1,char* s2)
{
size_t i=0;
size_t len1 = strlen(s1)
size_t len2 = strlen(s2);
if(len1-len2<0) return len1;
for(;i {
size_t m = i;
for(size_t j=0;j {
if(s1[m]!=s2[j])
break;
m++;
剩余12页未读,继续阅读
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助