前言
本章讲解线性表的顺序查找和折半查找
方法
1.概念
数据结构不但要研究数据本身的逻辑结构和存储结构,还要研究其操作,其中查找和排序是相对重要的一环,本次讲解的是线性表的顺序查找和折半查找。
2.顺序查找
在之前讲解顺序表的时候已经涉及到了顺序查找的一些细节。本次将以数组为例进行说明。
有数组如图所示,查找出6所在的索引位置?
顺序查找的精髓在于从第一个元素开始逐个进行查找,没有什么难度。
该算法的时间复杂度T(n) = O(n),空间复杂度为S(n)=O(1)
使用Java实现顺序查找:
package cn.edu.ccut.search;
public class SequentialSearch {
public static void main(String[] args) {
int [] attrs = {4,2,5,7,1,6,8};
int key = 6;
int index = find(attrs, key);
if(index != -1){
System.out.println("元素"+key+"所在的索引位置为:"+index);
}else {
System.out.println("元素"+key+"不存在!");
}
}
public static int find(int [] attrs,int key){
for (int i = 0; i < attrs.length; i++) {
if(key == attrs[i])
return i;
}
return -1;
}
}
程序运行结果为:
3.折半查找
有数组如图所示,查找出6所在的索引位置?
显然是找不到的!!
折半查找有个前提条件,就是数组是有序的!如下面数组所示:
折半查找的精髓在于:
- ① 首先确定整个查找区间的中间位置 mid = ( left + right )/2 。
- ② 用待查关键字值与中间位置的关键字值进行比较; 若相等,则查找成功 若大于,则在后(右)半个区域继续进行折半查找 若小于,则在前(左)半个区域继续进行折半查找。
- ③ 对确定的缩小区域再按折半公式,重复上述步骤。最后,得到结果:要么查找成功, 要么查找失败。折半查找的存储结构采用一维数组存放 。
该算法的时间复杂度为:T(n)=O(log2n),空间复杂度为S(n)=O(1)
使用Java实现折半查找:
package cn.edu.ccut.search;
public class BinarySearch {
public static void main(String[] args) {
int [] attrs = {1,2,4,5,6,7,8};
int key = 6;
int index = find(attrs, key);
if(index != -1){
System.out.println("元素"+key+"所在的索引位置为:"+index);
}else {
System.out.println("元素"+key+"不存在!");
}
}
public static int find(int [] attrs,int key){
int left = 0;//确定左起点
int right = attrs.length-1;//确定右起点
while (left <= right) {//进入循环
int mid = left + right;//求出中间值
if(attrs[mid] == key){//查找到元素
return mid;
}else if(attrs[mid] < key){
left = mid + 1; //中间元素小于要查找的元素,左起点更改
}else {//attrs[mid] > key 中间元素大于要查找的元素,右起点更改
right = mid - 1;
}
}
return -1;
}
}
程序运行结果为:
综合以上分析,显然折半查找(二分查找)在时间上更加占据优势。