数据结构查找算法

数据结构查找算法

1.顺序查找

又叫线性查找,是一种基本的查找算法。查找过程:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,
若某个记录的关键字和给定值相等,则查找成功,如果查找到表中最后一个元素,还没有找到,则查找不成功。

代码:

public int Search(int [] array , int key){
	int i;
	for(i = 0; i<array.length; i++){
		if(array[i] == key){
		return i;
		}
	}
	return -1;
	}

时间复杂度:顺序查找的时间复杂度为O(n);
优点:简单,是对表中数据元素的存储没有要求;
缺点:当n很大时,查找效率极为低下。

2.折半查找

又称为二分查找。它的前提是线性表中的记录是关键码有序,线性表必须采用顺序存储。
查找过程:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于关键字,则在中间记录的左边查找;
若大于关键字,则在中间记录的右边查找。不断重复,直到查找成功。
代码:

public int  Search(int []  array , int key){
int low,higt,mid;
	low = 0;
	high = array.length -1;
	while(low <= high){
	  mid = (low+high)/2;
	  if(key< array[mid])
	       high = mid-1;
	   else if (key>array[mid])
	       low = mid+1;
	   else 
	       return    mid;
	     }
	    return -1;
	}

时间复杂度:顺序查找的时间复杂度为O(logn);
优点:效率快;
缺点:需要查找表有序。

3.插值查找

基于二分查找,将查找的选择改进为自适应选择,可以提高查找效率。根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,
其核心就在于插值得计算公式:mid = low + (key -a [low])/(a[high] - a[low])(high  - low),替换了二分查找到的:mid=low+1/2(high-low)
public int    Search(int[] array, int key){
       
	int low,high,mid;
       low = 0;                //定义最低下标为数组首位
     
	     high = array.length-1;  //定义最高下标为数组末位
       
	     while (low <= high){
      
	     mid = low + (high-low)*(key-array[low])/(array[high]-array[low]); //自适应选择查找点
    
	     if(key < array[mid])
               high = mid-1;
       
	     else if(key > array[mid])
               low = mid+1;
      
	     else
               return mid;
   
	     }
      
	  return -1;
    }

时间复杂度:顺序查找的时间复杂度为O(logn);
优点:效率快,且优于二分查找;
缺点:需要查找表有序且不适合极端不均匀的数据。

4.二叉排序树查找

二叉排序树中查关键字,在二叉树不为空的情况下,首先将被查找的值同树的节点进行比较,有三种情况:
如果相等,则查找成功;
如果比较结果为根节点的关键值较大,则说明关键字可能存在其左子树中;
如果比较结果为根节点的关键值较小,则说明关键字可能存在其右子树中;
代码:(运用递归的方法)
BiTree    Search (BiTree  T, KeyType  key){
//如果递归过程中T为空,则查找结果返回null;或者查找成功,返回指向该关键字的指针
if(!T || key == T->data) {
retur n  T;
}else  if (key<T->data) {
//递归遍历左孩子
return  Search(T->lchild, key);
}else{
//递归遍历右孩子
return  Search(T->rchild, key);
}
}

时间复杂度:O(logn),最坏情况下的复杂度O(n)
优点:查找效率很高
缺点:用这个算法之前要先创建树;

你可能感兴趣的:(数据结构)