数据结构之折半查找
2013-11-03 15:32
281 查看
折半查找:就是对一组有序的数据(必须是有序,然后递增的,不过也可以是递减的,不过得稍微修改下代码),每次取序列中间的数与关键字比较,如果关键字小于中间的数,则关键字不可能落在大于中间到最右边的那一段序列里,所以下一次就只需要在中间数的左边的序列里查找,如果关键字大于中间的数,类似于小于中间的数,下一次查找只需要查找右边序列。
(0)初始化:
left = 0;
right = n;
middle = (left+righ)/2;
[R0..............................Rm.............................Rn]
↑ ↑ ↑
left middle right
(1)如果 关键字key < data[middle]:
left = left;
right = middle-1;
middle = (left+righ)/2;
[R0.........Rm..........Rn]
↑ ↑ ↑
left middle right
(2)如果 关键字key > data[middle]:
left = middle+1;
right = right;
middle = (left+righ)/2;
[R0...........Rm.........Rn]
↑ ↑ ↑
left middle right
(3)如果 关键字key == data[middle],就找到咯。
(4)不断重复[b] (1)[b] (2)[b] (3)。[/b][/b][/b]
其实,折半查找就是一棵二叉树,把第一个中间点看成根结点,中间点左边的序列就是左子树,中间结点右边的序列就是右子树,依次类推,根据二叉树的性质,有n个结点的二叉树的深度为k=logn+1(注意logn的底为2)所以,折半查找最坏也是O(logn).
(0)初始化:
left = 0;
right = n;
middle = (left+righ)/2;
[R0..............................Rm.............................Rn]
↑ ↑ ↑
left middle right
(1)如果 关键字key < data[middle]:
left = left;
right = middle-1;
middle = (left+righ)/2;
[R0.........Rm..........Rn]
↑ ↑ ↑
left middle right
(2)如果 关键字key > data[middle]:
left = middle+1;
right = right;
middle = (left+righ)/2;
[R0...........Rm.........Rn]
↑ ↑ ↑
left middle right
(3)如果 关键字key == data[middle],就找到咯。
(4)不断重复[b] (1)[b] (2)[b] (3)。[/b][/b][/b]
#include <iostream> using namespace std;
// 折半查找 // 必须保证数据要是"有序"和"递增"的 int binarySearch(int data[], int n, int key) { int left = 0; int right = n; int middle; while (left <= right) { middle = (left + right)/2; // 关键字key小于中间的元素 if (key < data[middle]) { left = middle + 1; } // 相等 else if (key == data[middle]) { return middle; } // 关键字key大于中间的元素 else { right = middle - 1; } } return -1; }
int main() { int data[10] = {0,1,2,3,4,5,6,7,8,9}; int n = 9; int index = binarySearch(data, n, 4); cout<<index<<endl; if (index!=-1) { cout<<data[index]; } return 0; }
其实,折半查找就是一棵二叉树,把第一个中间点看成根结点,中间点左边的序列就是左子树,中间结点右边的序列就是右子树,依次类推,根据二叉树的性质,有n个结点的二叉树的深度为k=logn+1(注意logn的底为2)所以,折半查找最坏也是O(logn).
相关文章推荐
- 数据结构与算法实验题 6.1 鼹鼠掘土挑战赛
- 数据结构与算法实验题 6.1 鼹鼠掘土挑战赛
- 数据结构与算法实验题 6.1 s_sin’s bonus
- 数据结构与算法实验题 6.1 s_sin’s bonus
- 数据结构 POJ 2431 Expedition 二叉树 并查集 POJ 1182 食物链
- Python-数据结构
- [数据结构]程杰 线索二叉树代码
- 数据结构之一(基本数据结构)
- 线性索引查找 - 数据结构和算法72
- 数据结构之冒泡排序
- 数据结构之快速排序
- 经典数据结构--简单链表
- 数据结构——基本排序汇总
- 渣渣小本求职复习之路每天一博客系列——数据结构与常用算法(2)
- MySQL索引背后的数据结构及算法原理[转]
- 数据结构之希尔排序
- <数据结构>二叉树的递归、非递归以及层次遍历算法C语言实现
- 数据结构:位图法(bitmap||BMP)
- [Usaco2011 Nov]Cow Steeplechase奶牛越野跑(二分图裸题)
- 顺序表.cpp [数据结构实现 之 线性表]