(2020.9.10)
练习3:
在一个有序数组中查找某个具体数字n。编写int binsearch(int x,int v[],int n);
功能:在v[0]<=v[1]<=v[2]...<=v[n-1]的数组中查找x
方法一:
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);(计算元素个数)
for (i = 0; i < sz; i++)
{
if (k == arr[i])(而不是k==sz,因为arr[i]求出来的是下标)
{
printf("找到了,下标是:%d\n",i);
break;
}
}
if (i == sz)
printf("找不到");
(结果为6,而7的下标确实是6)
1的下标是0
折半查找算法/二分查找算法(方法二)可以提高效率,
最多大概找log以2为底数的n次:
举例子:
2^32次方=42亿多,最多只需查找32次
最右下标即为元素个数-1
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int k = 7;
int sz = sizeof(arr) / arr[0];
int right = sz - 1;(left和right分别代表下标,所以要sz-1)
int mid = (left + right) / 2;
while (left<=right)(只有这样才保证,因为有可能找不到所需元素之后
,左下标跑到右下标的右边)
{
if (arr[mid] > k)
{
right = mid - 1;
}
if (arr[mid < k])
{
left = mid + 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break;(因为外面加了循环,所以要break才能停下来)
}
}
if (left > right)
{
printf("找不到");(只有当left<=right不满足的情况才会跳到底下,
或者break之后来到这里)
}
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left<=right)
{
int mid = (left + right) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,下标是%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到");
}
(重新打了一遍,这一次没有错,之前一直出错但不知道原因)
这个代码哪些地方值得注意:
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left<=right)(只有left<=right时说明中间有元素,此时才能
进行查找)
{
int mid = (left + right) / 2;(每次查找都要通过左右元素来确定
一个中间元素的下标,那这个中间元素与锁定的元素去比较)
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)(mid是指的下标,而k指的是元素)
{
left = mid + 1;
}
else
{
printf("找到了,下标是%d\n", mid);
break;(当找到了这个元素要跳出来)
}
}
if (left > right)
{
printf("找不到");
}
练习4:
编写代码,演示多个字符从两端移动,向中间汇聚
char arr1[] = "welcom to bit!!!!!!";
char arr2[] = "##################";
int left = 0;
int right = sizeof(arr1) / sizeof(arr1[0]) - 2;(是减去2不是1因为数组元素末尾
还包括一个\0,如果只是-1,得到的结果是\0而不是末尾的字符感叹号)
可以把上面那句话改成:
int right=strlen(arr1)-1;(把\0前面的元素个数求出来,由于下标总是
比元素个数少一,所以减去1)
strlen:用来求字符串长度,但个数里面不包括\0,遇到\0就停止
库函数就必须引用头文件
char arr1[] = "welcome to bit!!!!!!";
char arr2[] = "####################";
int left = 0;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);(1秒=1000毫秒,作用:每打印一次后停留1秒,并且S记得
大写,必须引用头文件,#include<windows.h>)
system("cls");system:是用来执行系统命令的一个函数,(cls--清空屏幕),
由于system是库函数,需要引用头文件#include<stdlib.h>
left++;
right--;
}
printf("welcome to bit!!!!!!");