折半查找
折半查找(二分查找)对处理元素要求
- 有序
- 顺序存储结构
基本思想
就是每次查找中间元素和待查找元素比较
- 如果相同,返回该位置
- 不同,且中间元素大于待查元素,则从右半边查找
- 不同,且中间元素小于待查元素,则从左半边查找
注意:如果前边标记大于小于后边标记了,那就说明没找到
两种思路
递归
#include <stdio.h> int erfen_d(int *a, int begin, int end, int value) { if (end >= begin) { int mid = (begin + end) / 2; if (a[mid] == value) return mid; else if(a[mid] > value) return erfen_d(a, begin, mid-1, value); else return erfen_d(a, mid+1, end, value); } return -1; } int main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; printf("%d** ",erfen_d(a, 0, 8, 9));//0是首位置,9是末位置, 9是待查元素
return 0; }
迭代
#include <stdio.h> int erfen(int *a, int begin, int end, int value) { while (end >= begin) { int mid = (begin + end) / 2; if (a[mid] == value) return mid; else if(a[mid] > value) end = mid - 1; else begin = mid + 1; } return -1; } int main() { int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; printf("%d** ",erfen(a, 0, 8, 1)); //0是首位置,9是末位置, 1是待查元素 return 0; }
复杂度分析
查找过程就是找二叉排序树,元素所在的高度即查找的次数(注意:第一层高度为1)
满二叉排序树,有这样的特点:
- 第h层最多元素个数:2k-1
- 前h层最多元素个苏:2k-1
分析(元素个数为N,高度k)
分类: 算法&&程序设计