1. 折半查找法
//折半查找(二分查找,一定数组有序) 时间复杂度O(logn)
#include<stdio.h>
int BinSearch(int arr[], int len, int key)
{
assert(arr != NULL); //安全处理机制
if (NULL == arr)
{
return -1;
}
int low = 0; //左边指针
int high = len - 1; //右边指针
int mid;//int mid = (low + high)/2; //每次缩小一半,需要和key比较的中间值
while (low <= high)//当low和high之间范围内 至少有1个值,则继续比较
{
mid = (low + high) / 2;//mid = (high-low)/2 + low;//让mid指向临时的范围中间值
if (arr[mid] == key)//如果mid指向的值就是key 则直接返回其下标
{
return mid;
}
else if (arr[mid] < key) //如果mid指向的值小于key 则要找的key这个值一定在mid的右半边
{
low = mid + 1;
}
else//如果mid指向的值大于key 则要找的key这个值一定在mid的左半边
{
high = mid - 1;
}
}
//此时while循环结束,还没有退出函数,则要找的这个值 一定不存在于这个数组内,则返回-1
return -1;
}
int main()
{
int arr[] = { 1,3,4,5,8,10,20,23,36,50 };
int len = sizeof(arr) / sizeof(arr[0]);
int tmp = BinSearch(arr, len, 20);
printf("%d\n", tmp);
return 0;
}
运行结果:
2. 字符串拷贝4种不同写法---调用函数
第一种:
#include<stdio.h>
#include<assert.h>
void My_strcpy1(char crr[], char arr[])
{
assert(crr!=NULL && arr!=NULL);
if(arr==NULL || crr==NULL)
{
return NULL;
}
int i;
for(i=0; *(arr+i)!='\0'; i++)
{
*(crr+i) = *(arr+i);
}
*(crr+i) = '\0';
}
int main()
{
char arr[10] = "abcde";
char crr[10];
My_strcpy1(crr, arr);
printf("arr:%s\n", arr);
printf("crr:%s\n", crr);
return 0;
}
第二种:
#include<stdio.h>
#include<assert.h>
void My_strcpy2(char crr[], char arr[])
{
assert(crr!=NULL && arr!=NULL);
if(arr==NULL || crr==NULL)
{
return NULL;
}
int i;
for(i=0; arr[i]!='\0'; i++)
{
crr[i] = arr[i];
}
crr[i] = '\0';
}
int main()
{
char arr[10] = "abcde";
char crr[10];
My_strcpy2(crr, arr);
printf("arr:%s\n", arr);
printf("crr:%s\n", crr);
return 0;
}
第三种:
#include<stdio.h>
#include<assert.h>
void My_strcpy3(char crr[], char arr[])
{
assert(crr!=NULL && arr!=NULL);
if(arr==NULL || crr==NULL)
{
return NULL;
}
char *p = arr;
char *q = crr;
for(p; *p!='\0'; p++,q++)
{
*q = *p;
}
*q = '\0';
}
int main()
{
char arr[10] = "abcde";
char crr[10];
My_strcpy3(crr, arr);
printf("arr:%s\n", arr);
printf("crr:%s\n", crr);
return 0;
}
第四种:
#include<stdio.h>
#include<assert.h>
char* My_strcpy(char *des, const char *src)
{
assert(des!=NULL &&src!=NULL);
if(des==NULL || src==NULL)
{
return NULL;
}
char *address = des;//address作用是防止 return的时候 des指向最后了
while(*des++ = *src++);//先执行++再执行*,注意优先级问题,如果优先级相同,那就看结合方向
return address;
}
int main()
{
char arr[10] = "abcde";
char crr[10];
My_strcpy(crr, arr);
printf("arr:%s\n", arr);
printf("crr:%s\n", crr);
return 0;
}
四种方法运行结果: