一、查找算法---二分法(补充):大幅度降低查找效率
1.基本原理
将搜索范围每次缩小一半,从而快速定位目标值。
2.搜索过程:
1)初始化:设置两个指针 begin 和 end,分别指向数组的起始位置(a[0])和结束位置(a[len-1])。
2)循环比较:
计算中间位置 mid = (begin + end) / 2。
比较中间元素 a[mid] 与目标值 n 的大小:
若 a[mid] > n:说明目标值在左半部分,更新 end = mid - 1,缩小搜索范围到左半区。
若 a[mid] < n:说明目标值在右半部分,更新 begin = mid + 1,缩小搜索范围到右半区。
若 a[mid] == n:直接找到目标值,搜索结束。
3)终止条件:
当 begin > end 时,表示搜索范围为空,目标值不存在;否则继续循环直至找到目标值。
#include
int main(void)
{
int a[]={1,2,3,4,5,6,7,8,9,0};
int len = sizeof(a) / sizeof(a[0]);
int i,j;
for(j = len - 1; j > 0 ; --j)
{
for(i = 0;i < len - 1; ++i)
{
if(a[i] > a[i + 1] )
{
int t;
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
int n;
int begin = 0;
int end = len - 1;
scanf("%d",&n);
while(begin <= end)
{
int mid = (begin + end) / 2;
if(a[mid] > n)
{
end = mid - 1;
}
else if(a[mid] < n)
{
begin = mid + 1;
}
else
{
break;
}
}
if(begin <= end)
{
printf("found\n");
}
else
{
printf("not found\n");
}
return 0;
}
二、字符数组
1.定义
用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。
2.表达形式
char 数组名 [ 字符总容量]
3.字符数组的初始化
char c[ 10] = {'a','b','c','d','e','f','g','h','i','\0'};即 char c [10]="abcdefghi"
计算字符数组的长度:sizeof(c)
输出字符数组长度: printf("%lu\n",sizeof(c));
说明:
1>.如果初始化的字符个数小于字符长度,则未被定义的元素自动为空字符'\0'。
2>.字符数组内的总长度要比所表示的有效字符的个数加一,因为其中包含了一个空字符'\0',其表示字符串的结束,会被隐藏在字符串的末尾。
4.各类程序
1>.打印字符串
#include
int main(void)
{
char s[100] = "Hello ";
int i = 0;
while(s[i] != '\0')
{
putchar(s[i]);
++i;
}
puts(s);
putchar('\n');
return 0;
}
关键点说明:
1字符串结束符:C 语言字符串以'\0'结尾,循环通过检测该字符来确定字符串的结束位置
2).putchar()与puts()的区别:
putchar():每次只能输出一个字符,不会自动添加换行。
puts():一次性输出整个字符串,并自动添加换行。
3).puts()已经添加了一个换行,而后续的putchar('\n')会再添加一个换行,导致最终输出有两个连续的空行。
可简化为:
#include
int main(void)
{
char s[100] = "Hello ";
int i = 0;
puts(s);
putchar('\n');
return 0;
}
以上两种均可将字符数组中的字符串打印出来。
2>.输出字符串
1)scanf("%s",s):scanf在键盘输入时,会将空格,Tab,换行符均视为输入结束。
2)gets(s):只要输入回车键就会停止输入,由于gets() 不限制输入长度,可能导致缓冲区溢出。
3)fgets(s,sizeof(s),stdin):会读取换行符 \n 并存储在字符串中,若越界访问时,输出结果则会为正确字符长度的任意字符。
3>.计算字符长度
1)sizeof(s):计算的是该字符数组的总容量
2)strlen(s):计算的是该字符串的有效字符长度
程序如下:
#include
int main(void)
{
char s[10] = "Hello";
int i = 0;
int counter = 0;
while(s[i] != '\0')
{
counter += 1;
++i;
}
printf("%d\n",counter);
return 0;
}
其可以简化为:
#include
int main(void)
{
char s[10] = "Hello";
int i = 0;
printf("%lu\n",strlen(s));
printf("%d\n",sizeof(s));
return 0;
}
4>.拷贝字符串
strcpy(目的字符数组,原字符数组);
#include
int main(void)
{
char s1[100] = "Hello";
char s2[100];
int i = 0;
while(s1[i] != '\0')//strcpy(s2,s1);
{
s2[i] = s1[i];
++i;
}
s2[i] = '\0';
puts(s2);
return 0;
}
简化为:
#include
int main(void)
{
char s1[100] = "Hello";
char s2[100];
int i = 0;
strcpy(s2,s1);
puts(s2);
return 0;
}
5>.两数组拼接
strcat(目的字符组,原字符组);
#include
int main(void)
{
char s1[100] = "Hello ";
char s2[100] = "World!";
int i = 0;
int j = 0;
while(s1[i] != '\0')
{
++i;
}
while(s2[j] != '\0')
{
s1[i] = s2[j];
++i;
++j;
}
s1[i] = '\0';
puts(s1);
return 0;
}
简化为:
strcat(s1,s2);
puts(s2);
6>.字符串的比较
strcmp(s1,s2);//其结果为int型
printf("%d\n",strcmp(s1,s2));//其输出结果>0,则s1 >s2;若<0,则s1 其strcmp 的原理程序为: 其原理是,先比较两个数组的第一个字符,如果不相同,则ASCII码值大的则其数组大,反之则小;若第一个字符相同,则依次顺位按照上述方式进行比较,如若一直相同,则该程序碰见'\0'结束比较。 <注意>:s1 不能直接和s2直接比较,其s1>s2表示的是s1和s2的地址的大小,而不是其字符串的大小。#include
#include