二分查找:
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
//考虑边界条件
1 //[]闭区间 2 int Binaryserach(int *array, int size, int key) 3 { 4 assert(array != NULL); 5 int left = 0; 6 int right = size - 1; 7 while (left <= right) 8 { 9 int mid =( (right - left) >>1) + left; 10 if (array[mid] > key) 11 { 12 right = mid - 1; 13 } 14 else if (array[mid] < key) 15 { 16 left = mid + 1; 17 } 18 else 19 { 20 return mid; 21 } 22 } 23 return -1; 24 }
1 //[)半开半闭区间 2 int Binaryserach(int *array, int size, int key) 3 { 4 assert(array != NULL); 5 int left = 0; 6 int right = size; 7 while (left < right) 8 { 9 int mid =( (right - left) >>1) + left; 10 if (array[mid] > key) 11 { 12 right = mid ; 13 } 14 else if (array[mid] < key) 15 { 16 left = mid + 1; 17 } 18 else 19 { 20 return mid; 21 } 22 } 23 return -1; 24 }
/*递归实现(递归算法解题通常显得比较简洁,但递归算法解题的运行效率较低;
在递归调用的过程中系统为一层返回点、局部变量开辟了栈来存储,空间复杂度增大。一般情况下不建议用递归算法设计程序)*/
1 int Binaryserach(int *array, int left,int right,int key) 2 { 3 assert(array != NULL); 4 if (left <= right) 5 { 6 int mid = ((right - left) >> 1) + left; 7 if (array[mid] == key) 8 { 9 return mid; 10 } 11 if (array[mid] > key) 12 { 13 return Binaryserach(array, left, mid - 1, key); 14 } 15 else 16 { 17 return Binaryserach(array, mid + 1, right, key); 18 } 19 } 20 else 21 return -1; 22 }