考研路_数据结构_查找1_顺序查找和二分查找
来源:互联网 发布:淘宝老板 编辑:程序博客网 时间:2024/04/30 11:33
数据结构常用查找算法_顺序查找
顺序查找:在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。
C语言实现:
int Linear_Search1(int *a, int n, int key) {//从序列表中查找为key的关键值,成功则返回其下标值,否则查找失败,返回-1int i;for(i==1; i<=n; i++) {if(a[i] == key) {return i;}}return 0;}
上述顺序查找代码中,并未最优化的,因为每次循环时都需要对i,进行越界判断(;i<=n;),为避免重复判断,可用哨兵法。代码如下:
int Linear_Search2(int *a, int n, int key) {int i;a[0] = key; /*将关键值key赋值给a[0],即设置“哨兵”*/i = n;while(a[i] != key) {i--;}return i; /*返回0则说明未找到关键值key*/}
Linear_Search2代码详解:
该段代码从尾部n开始查找,将a[0]赋值为key,若在查找过程中,成功找到key值,则返回其下标i,若无法找到,则i的值等于0。
“哨兵”法:在查找前设置哨兵,可避免查找过程的每次的溢出判断,在总数据较多时有效的改善了Linear_Search1的方法。
java语言实现:
public class LinearSearch {public int getIndex(int[] arr, int key) {int i;for(i=0; i<arr.length; i++) {if(arr[i] == key)return i;}return -1;}}
这是个迭代过程,从数组下标为0到数组下标最大值,若找到给定关键值,则返回该值在数组中的位置,否则查找失败,时间复杂度为O(n)。
数据结构常用查找算法_二分查找
二分查找又称折半查找:每次选取剩下一半的中间进行查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
C语言实现:
int Binary_Search(int *a, int n, int key) {int low = 0; /*设置下区间*/int high = n; /*设置上区间*/if(a[low] == key) /*判断是否为上下端点*/return low;if(a[high] == key)return high;while(low <= high){int mid = low + (high - low)/2; /*避免((low+high)/2)中(low+high)的结果溢出,即值大于数据类型所能表达的最大值*/if(a[mid] == key) /*查找到关键值并返回其下标值*/return mid;else if(a[mid] < key) low = mid + 1; /*中间值比关键值小,则把中间值加1赋值给下一轮的下区间*/else high = mid - 1; /*中间值比关键值大,则把中间值减1赋值给下一轮的上区间*/}}
java语言实现:
public class BinarySearch {public int getIndex(int[] arr, int key) {int low = 0; //下区间int high = arr.length-1;//上区间while(low <= high) { int mid = (low + high)/2;if(arr[mid] == key) {return mid; //查找成功,返回关键值在数组中的位置}else if(arr[mid] < key) {low = mid + 1; //中间值比关键值小,则把中间值加1赋值给下一轮的下区间}else {high = mid - 1; //中间值比关键值大,则把中间值减1赋值给下一轮的上区间}}return -1; //查找失败}}
二分查找过程,时间复杂度为O(logn)。
- 考研路_数据结构_查找1_顺序查找和二分查找
- 01_查找算法_顺序查找_二分查找
- 考研路_数据结构_查找2_插值查找和斐波那契查找
- 查找_二分查找
- 查找算法_二分查找
- 查找算法_顺序查找
- 20170927_二分查找
- 数据结构_查找_次优查找树
- 数据结构_折半查找
- 数据结构_折半查找
- 数据结构(java)_数组顺序查找
- 数据结构_查找_静态查找数表_二叉排序树
- 数据结构_查找_动态查找表_二叉排序树
- 算法导论_二分查找
- 黑马程序员_二分查找
- 数据结构(C#)_查找(静态查找)
- 数据结构(C#)_查找(动态查找)
- 常用数据结构_排序_查找练习
- C#多线程参数传递
- sap调用net配置实现过程
- 找工作experience
- FlashBuilder精选插件
- 建国方略
- 考研路_数据结构_查找1_顺序查找和二分查找
- 堆,栈,内存泄露,内存溢出介绍
- MD5 算法
- Python 扫描IP段 指定端口是否开放
- 建国方略 第一章
- elf文件格式实例解析
- 建国方略 第二章
- volatile关键字
- HOJ 1599 Box of Bricks