一、二分查找法
二分查找法是一种在有序数组中查找某一特定元素的高效算法。其基本思想是通过逐步缩小查找范围来快速定位目标元素。具体步骤如下:
- 初始条件:确保数组是有序的(升序或降序)。
- 设定左右边界:设定初始的左边界
begin
和右边界 end,一般为数组的起始和结束位置,即 begin= 0
,end= n - 1
。 - 计算中间位置:计算当前查找范围的中间位置
mid
,通常使用公式mid = (begin + end) / 2
- 比较中间元素:将中间位置的元素
array[mid]
与目标元素target
进行比较:- 如果
array[mid] == target
,则找到了目标元素,返回mid
。 - 如果
array[mid] < target
,则目标元素在右半部分,将左边界beign调整为mid + 1
。 - 如果
array[mid] > target
,则目标元素在左半部分,将右边界end调整为mid - 1
。
- 如果
- 重复步骤3和4:不断调整查找范围,直到找到目标元素或查找范围为空(即
begin > end
)。
实例代码:
int main(void)
{
int n, a[] = {9,8,7,6,5,4,3,2,1,0};
int len = sizeof(a) / sizeof (a[0]);
int begin = 0 , end = len - 1,mid;
scanf("%d"&n);
for(int i = 0 ; i < len ; ++i)
{
printf("%d\t",a[i]);
}
while(begin <= end)
{
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("\nFound:%d,index = %d\n",a[mid],mid);
}
else
{
printf("\nNot Found:%d,index = %d\n",a[mid],mid);
}
return 0;
}
二、字符数组
1.定义
字符数组通常用于存储字符串。字符串是以字符数组的形式表示,并且以空字符 \0
结尾来标志字符串的结束。
字符数组有几种定义方式:
1.直接定义和初始化字符数组:
char str1[] = "Hello, World!";
2.手动指定数组大小并初始化:
char str2[14] = "Hello, World!";
3.手动逐个字符初始化:
char str3[] = {'H', 'e', 'l', 'l', 'o','\0'};
4.定义未初始化的字符数组:
char str4[20]; // 定义一个可以存储20个字符的字符数组
2.遍历统计
1.遍历(遍历数组并输出元素)
int main(void)
{
char s[16] = "Hello World!";
// puts(s);
int i = 0 ;
while( s[i] != '\0')
{
putchar(s[i]);
++i;
}
putchar('\n');
return 0;
}
2.拷贝(将字符串s1的内容复制到s2)
int main(void)
{
char s1[100] = "Hello World!";
char s2[100];
int i = 0;
while(s1[i])
{
s2[i] = s1[i];
++i;
}
s2[i] = '\0';
puts(s2);
return 0;
}
3.拼接(将字符串b拼接到字符串a后面)
int main(void)
{
char a[100] = "Hello";
char b[100] = "World!";
int i = 0 , j = 0;
while(a[i])
{
++i;
}
while(b[j])
{
a[i] = b[j];
++i;
++j;
}
b[i] = 0;
puts(a);
return 0;
}
4.比较字符串
int main(void)
{
char a[100] = "Hello";
char b[100] = "World";
int i = 0;
while(a[i] == b [i] && a[i] && b[i])
{
++i;
}
if(a[i] - b[i] > 0)
{
printf("a > b\n");
}
else if(a[i] - b [i] == 0)
{
printf("a = b\n");
}
else
{
printf("a < b\n");
}
return 0;
}
5.字符串逆序
int main(void)
{
char s[100];
fgets(s,sizeof(s) / sizeof(s[0]),stdin);
int i ;
for(i = 0 ; i < strlen(s) / 2; ++i)
{
char t;
t = s[i];
s[i] = s[strlen(s) - i - 1];
s[strlen(s) - i - 1] = t;
}
puts(s);
return 0;
}
puts
作用:输出字符串到标准输出,并在末尾自动添加一个换行符。
int puts(const char *str);
gets
作用:从标准输入读取一行字符串,并存储在指定的字符数组中,以空字符 \0
结尾。
char *gets(char *str);
strlen
函数
strlen
函数用于计算字符串的长度(不包括结尾的空字符 \0
)。
size_t strlen(const char *str);
<string.h>头文件定义了许多用于字符串的函数,这些函数可以方便地对字符串进行复制、连接、比较、查找等操作。以下是一些常用的字符串操作函数及其说明:
-
字符串复制:
char *strcpy(char *dest, const char *src);
将字符串src
复制到 。char *strncpy(char *dest, const char *src, size_t n);
将字符串src
的前n
个字符复制到dest
。
-
字符串连接:
char *strcat(char *dest, const char *src);
将字符串src
连接到dest
的末尾。char *strncat(char *dest, const char *src, size_t n);
将字符串src
的前n
个字符连接到dest
的末尾。
-
字符串比较:
int strcmp(const char *str1, const char *str2);
比较字符串str1
和str2
,返回值小于、等于或大于0分别表示str1
小于、等于或大于str2
。int strncmp(const char *str1, const char *str2, size_t n);
比较字符串str1
和str2
的前n
个字符。