引言
二分查找算法 我们应该也不陌生 就在分治法把他说得彻彻底底了 但分而治之算法思想 只是算法的部分 递归 和循环那个效率高呢 很明显循环 所以不必要多说 直接干
二分查找算法核心思路
二分查找算法是一种在有序数组中查找特定元素的搜索算法。
它的核心思路是每次查找都从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果目标元素大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且同样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到目标元素。
记住只有顺序表和数组能用 当然二叉搜索树本来按照二分查找算法来的 这数据结构的规定 但算法只有连续并且有快速关键的索引 才是真正的快速 不是说链表不能实现 而是没有随机访问
可随机访问才有性价比
二分查找算法专区
// 函数定义:在给定的数组中查找特定的值
int BinarySearch(void* arr, int size,int elementSize, void *value ,int (*cmp)(void *,void*)) { // 检查参数是否有效 if (!arr&&elementSize<=0 &&size>0 &&!value) { // 如果数组为空、元素大小小于等于0、数组大小大于0且查找值为空,则返回-1 return -1; } // 初始化左边界和右边界 int left = 0; int right = size - 1; // 声明用于存储比较结果的变量 int ret; // 当左边界小于等于右边界时,继续查找 while (left <= right) { // 计算中间位置 int mid = left + (right - left) / 2; // 使用cmp函数比较中间位置的值与查找值 ret = cmp((char*)arr + (mid * elementSize), value); // 如果cmp返回0,说明找到了目标值,返回中间位置的索引 if (ret == 0) { return mid; } else if (ret > 0) { // 如果cmp返回大于0,说明查找值大于中间位置的值,向左半部分继续查找 right = mid - 1; } else { // 否则,查找值小于中间位置的值,向右半部分继续查找 left = mid + 1; } } // 如果循环结束仍未找到目标值,返回-1表示未找到 return -1;
}// 定义一个比较函数,名为int_comp,它接受两个void类型的指针作为参数
int int_comp(void* val1, void* val2) { // 将void类型的指针val1转换为int类型的指针Element1 int* Element1 = (int*)val1; // 将void类型的指针val2转换为int类型的指针Element2 int* Element2 = (int*)val2; // 返回两个指针所指向的整数的差值。这里使用了指针解引用(*)操作符来获取指针指向的值。 return (*Element1 - *Element2);
}// 定义一个比较函数,名为char_comp,它接受两个void类型的指针作为参数
int char_comp(void* val1, void* val2) { // 将void类型的指针val1转换为char类型的指针Element1 char* Element1 = (char*)val1; // 将void类型的指针val2转换为char类型的指针Element2 char* Element2 = (char*)val2; // 返回两个指针所指向的字符的ASCII码值的差值。这里使用了指针解引用(*)操作符来获取指针指向的字符,并通过ASCII码值的差值来表示字符的排序。 return (*Element1 - *Element2);
}