查找
目录
查找算法的分类:
1.静态查找和动态查找:动态和静态都是相对于表而言的。动态表中有删除和插入操作。
2.无序查找和有序查找:被查找的数列是否有序。
1.顺序查找
基本思想:顺序查找就是按照顺序,从数据结构的一端,顺序扫描,直到查找成功。
平均查找长度ASL:(n+1)/2
时间复杂度:O(n)
代码:
/**
* 顺序查找
* 思想:从前到后遍历,直到找到要找的元素,返回元素下标,
* 优点:二叉查找对于等概率的查找的性能是最优的。
* 时间复杂度:O(n)
* @param list
* @param x
*/
public static void Sort_Search(int list[],int x){
for(int i=0;i<list.length;i++){
if(list[i] == x){
System.out.println("元素处在第"+i+"位");
}
}
}
2.二分查找
前提:元素必须是有序的。而且是顺序表存储结构
基本思想:将目标元素与位于(1+n)/2位置的元素相比较,如果小于就在小于(1+n)/2的子表中继续上述操作,如果大于,就在大于中间值的子表中查找。
时间复杂度:O(logn)
代码:
/**
* 二分查找
* 前提:队列必须是有序的
* 思想:确定中间位置,然后与待查询值相比,
* 如果小于,则与左边数组中间值比较,
* 如果等于,则返回这个值,如果大于,则与右边数组中间值相比较
*时间复杂度:O(logn)
* @param list
* @param x
*/
public static void Binary_Search(int list[],int x){
Quick_Sort(list,0,list.length-1);
show_list(list);
int ad = Recursion(list,x,0,list.length-1);
System.out.println("元素处在第"+ad+"位");
}
/**
* 二分查找的递归
*/
public static int Recursion(int list[],int x,int left,int right){
int mid = (left+right)/2;
if(list[mid] == x )return mid;
else if(list[mid] > x) return Recursion(list,x,left,mid-1);
else return Recursion(list,x,mid+1,right);
}
3.插值查找
基本思想:差值查找法是基于二分法进行改进的算法,与二分法不同的是,差值法选择的不是中间值。而是根据所要查找的数进行自适应选择。mid=low+(key-a[low])/(a[high]-a[low])*(high-low)。
特点:当有序表的元素分布比较均匀时,插值查找比折半查找要好得多。
如果分布不均匀,则会花费更多时间。
时间复杂度:O(log(logn))
/**
* 插值查找
* 思想:基于二分查找
* 定义mid为mid = (high-low)*(key-arr[low])/(arr[high]-arr[low])
* 中间值的定义,与数组的极大值和极小值有关。
* 时间复杂度:平均O(loglogn),最坏O(logn)
* 优点:对于表长较大,而关键字分布又比较**均匀**的查找表来说,插值查找的平均性能比折半查找要好。
*/
public static void Interpolation_Search(int list[],int x