二分查找
二分查找法实质上是不断地将有序数据集进行对半分割,并检查每个分区的中间元素。再重复根据中间数确定目标范围并递归实行对半分割,直到中间数等于待查找的值或是目标数不在搜索范围之内!
参考v1.1:
#include <stdio.h>
#include <stdlib.h>
int BinarySearch(int* sorted, int len, int search)
{
int left = 0, right = 0, middle = 0;
/* 初始化边界left 和 right为边界值 */
left = 0;
right = len-1;
/* 循环查找, 直到左右两个边界重合 */
while (left <= right)
{
middle = (left + right) / 2;
if (sorted[middle] == search)
{
return middle;
}
else if (sorted[middle] > search) /* middle大于目标值 */
{
right = middle - 1; /* 右边: 范围向左移动 */
}
else if(sorted[middle] < search) /* middle小于目标值 */
{
left = middle + 1; /* 左边: 范围向右移动 */
}
}
return -1;
}
int main()
{
int arr[] = { 1,3,7,9,11 };
int search = 10;
int index = BinarySearch(arr, sizeof(arr) / sizeof(arr[0]), search);
printf("index: %d\n", index);
system("pause");
return 0;
}
运行环境: vs 2019
运行结果:
参考v1.2:
#include <stdio.h>
#include <stdlib.h>
int BinarySearch(int* sorted, int len, int search)
{
int left = 0, right = 0, middle = 0;
/* 初始化边界left 和 right为边界值 */
left = 0;
right = len-1;
/* 循环查找, 直到左右两个边界重合 */
while (left <= right)
{
middle = (left + right) / 2;
if (sorted[middle] == search)
{
return middle;
}
else if (sorted[middle] > search) /* middle大于目标值 */
{
right = middle - 1; /* 右边: 范围向左移动 */
}
else if(sorted[middle] < search) /* middle小于目标值 */
{
left = middle + 1; /* 左边: 范围向右移动 */
}
}
return -1;
}
int main()
{
int arr[] = { 1,3,7,9,11 };
int search[] = { -1,0,1,7,2,11,12 };
for (int i = 0; i < sizeof(search) / sizeof(search[0]); i++)
{
int index = BinarySearch(arr, sizeof(arr) / sizeof(arr[0]), search[i]);
printf("查找: %d index: %d\n", search[i], index);
}
system("pause");
return 0;
}
运行环境: vs2019
运行结果:
参考v1.3:
#include <stdio.h>
#include <stdlib.h>
int int_compare(const void* key1, const void* key2)
{
const int* ch1 = (const int*)key1;
const int* ch2 = (const int*)key2;
return (*ch1 - *ch2);
}
int char_compare(const void* key1, const void* key2)
{
const char* ch1 = (const char*)key1;
const char* ch2 = (const char*)key2;
return (*ch1 - *ch2);
}
int BinarySearch(void* sorted, int len,int elemSize, void* search, int (*compare)(const void* key1, const void* key2))
{
int left = 0, right = 0, middle = 0;
/* 初始化边界left 和 right为边界值 */
left = 0;
right = len - 1;
/* 循环查找, 直到左右两个边界重合 */
while (left <= right)
{
int ret = 0;
middle = (left + right) / 2;
ret = compare((char *)sorted+(elemSize*middle), search);
if (ret == 0)
{
return middle;
}
else if (ret > 0)
{
right = middle - 1;
}
else
{
left = middle + 1;
}
}
return -1;
}
int main()
{
int arr[] = { 1,3,7,9,11 };
int search[] = { -1,0,1,7,2,11,12 };
printf("整数查找测试开始\n");
for (int i = 0; i < sizeof(search) / sizeof(search[0]); i++)
{
int index = BinarySearch(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int),&search[i],int_compare);
printf("查找: %d index: %d\n", search[i], index);
}
printf("字符查找测试开始\n");
char arr1[] = { 'a','c','d','f','j' };
char search1[] = { '0','a','d','e','j' };
for (int i = 0; i < sizeof(search1) / sizeof(search1[0]); i++)
{
int index = BinarySearch(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(char),&search1[i], char_compare);
printf("查找: %c index: %d\n", search1[i], index);
}
system("pause");
return 0;
}
运行环境: vs2019
运行结果:
结语:
学到的知识要, 多复习, 多总结, 多敲. 需要时间的积累, 才能引起质的改变. 自己写不出来的永远是别人的.
分享一下我的技巧: 代数法把具体的数字带进去, 看看能能能找到规律(掌握思想).
还有就是画图, 也很重要. 用笔画出来, 把数代进去, 方法虽然笨, 但真的很实用, 好记忆不如烂笔头!!! 还有多用debug(调试工具)
我是小白, C/C++功力…, 你懂得, 写的文章可能不是很好. 如果存在问题, 欢迎大神给予评判指正.
错了不可怕, 可怕的是找不出bug, 谁没错过!!!
最近学操作系统我认为, 学什么都要成本(时间), 即使它是免费的, 我个人认为要挑来学, 挑重点来学, 而不是从头到尾, 除非考试考研.
这个知识点我没有完全掌握, 就是会了也要复习, 革命尚未成功, 同志还需努力!!! , 我会回来反复复习的
今日是: 2020年5月17日, (由于疫情的原因)现在没有返校. 写博客,也可自己加强记忆,就当写写日记吧!!!
希望给个赞: 反正你又不亏, 顺便而已