本本章是https://www.cnblogs.com/maybe2030/p/4715035.html#top 和第四版算法的总结。
1. 顺序查找
说明:适用于储蓄结构为顺序存储或链接存储的线性表。
基本思想:从数据端的开头依次扫描,若扫描到关键字与给定值K相等,则成功,若扫描结束还没找到,则失败。
时间复杂度分析:
平均长度为:ASL=1/n(1+2…+n)=(n+1)/2, O(n);
当查找不成功的时候,复杂度为n+1,O(n);
所以时间复杂度为O(n);
public class SequentialSearch
{
public static void search(Comparable[] a,int key)
{
int N = a.length;
for(int i=0; i<N; i++)
{
if(a[i]==key)
return i;
}
return -1;
}
}
2. 二分查找
说明:元素必须有序,若无序需要先进行排序操作。
基本思想:
- 将数据a排序, 排序后将查找值key与中间节点a[mid]比较;
- 若相等,返回mid索引;若a[mid]<key, 更新右边界索引high=mid-1;若a[mid]>key, 更新左边界索引为low=mid+1;
- 一直循环step2,终止条件为找到key或者low<=high;
时间复杂度分析:
最坏的情况下:查找的次数为log2(n)+1,所以期望值为O(logn)
// 递归版本
public class BinarySearch
{
public static void BS(Comparable[] a,int key,int low,int high)
{
int mid = low+(high-low)/2;
if (a[mid]== key)
return mid;
if (a[mid]>key)
return BS(a,key,low,mid-1);
if (a[mid]<key