一. 插入排序
思想: (在有序数列中)找一个适合的位置,插入
举例:
军训
5 2 4 6 3 1 8 7
0 1 2 3 4 5 6 7
新数组
先将5放到新数组第一位
50 1 2 3 4 5 6 7
再将2放进来 查看是否比前面的数小 是的话前一位往后挪
2 50 1 2 3 4 5 6 7
将4放进来 查看是否比前面的数小 是的话前一位继续往后挪
前面数比4小 后面数比4大 直接放下4
2 4 5
0 1 2 3 4 5 6 7
依此类推
for(j = 1;j < n;++j) //拿数
{
t = a[j]; //记录值
i = j; //记录位置
while(i > 0 && a[i-1] > t) //要么拿的数走到头了停,要么前面的值比拿的数小停
{
a[i] = a[i-1]; //将前一个位置的值往后挪
--i; //将地址下标往前偏移一位,为下一次比较或插入做好准备
} //找位置a[i] = t; //插入数
}
二 . 变长数组
int n = 10;
scanf("%d",&n);
int a[n]; //n不能初始化
三. 二分查找 (折半查找)
前提:
数据必须有序
思想:
- 首先,将待搜索区间的起始点和终止点确定为数组的第一个元素和最后一个元素。
- 在每一步中,找出待搜索区间的中间点,将中间点与目标值进行比较。
- 如果中间点的值等于目标值,搜索结束,返回结果。
- 如果中间点的值大于目标值,说明目标值可能在中间点的左侧,将待搜索区间缩小为左半部分。
- 如果中间点的值小于目标值,说明目标值可能在中间点的右侧,将待搜索区间缩小为右半部分。
- 重复以上步骤,直到找到目标值或者待搜索区间为空。
二分查找的时间复杂度为 O(log n),其中 n 是数组或列表的大小。它的效率较高,适用于大规模数据集的搜索。
四. 一维字符型数组:
字符数组: 主要作用,想处理字符串数据
unsigned char s[10] = {'h','e','l','l','o'}; //数组考虑unsigned char s[10] = {'h','e','l','l','o','\0'}; //字符串角度考虑
unsigned char s[10] = "hello";
以上三者本质存储时候,都是按照字符数组的形式存储
'\0' 对于字符串来说,叫结束标志
unsigned char s[] = {'h','e','l','l','o','\0'};
unsigned char s[] = {'h','e','l','l','o'};
unsigned char s[] = "hello";可不用设定数组长度,计算机会根据初始化的元素个数自动计算出字符数组长度。
注意:
1.字符串 -- 更关注的是字符串整体,而不是单个字符
2.字符串的结束标志 比较重要 ,表示字符串结束
3.处理字符串时,常常使用结束标志作为判断条件
五. 字符串输入输出函数
1.字符串输出函数
int puts(const char *s);
功能:
输出字符串
参数:
@s 字符串所在空间的首地址
返回值:
int 成功 >0
失败 -1
"hello" // '\0'
特点:
输出时,自动换行
练习:
定义一个字符数组
从键盘输入一个字符串到字符数组中
要求:一个字符一个字符输入
2. 字符串输入函数
char *gets(char *s);
功能:
输入字符串
参数:
@s 存放字符串一块内存空间
返回值:
表示的是 存储字符串那块空间的首地址
gets()
弊端:gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间.该函数只知道数组(内存空间)的开始处,并不知道数组的大小,如果输入的字符串过长容易溢出,可能擦写掉程序中的其他数据导致程序异常终止。原理:读取整行的输入直至遇到换行符,然后丢弃换行符,所以缓冲区中不会遗留换行符;储存其余字符,并在这些字符末尾添加一个空字符‘\0’使其成为一个字符串。
"hello" //字符串长度指的是 '\0' 前面有效字符的 个数
h e l l o'\0 ' //5就是字符串的长度6是数组长度
练习:
统计字符串的长度
gets();
练习:
char s1[10]= "hello";
char s2[10]= ; //字符串拷贝
s2 = s1; 这是错误语法 //C语言中不能整体赋值 ---别的一些语言中可以
六. 字符串拷贝函数
char *strcpy(char *dest, const char *src);
功能:
实现字符串拷贝
参数:
@dest 目标字符串
@src 源字符串
返回值:
成功 返回的是 dest地址
失败 NULL