顺序查找
基本思想
- 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素。
- 这是最基本的查找方法,也是时间复杂度最高的查找算法。
- 在数据过多时,这种方法并不适用。
代码实现
public Type SequenceSearch(Type[] list,Type t)
{
for(Type temp : list)
{
if(temp.equals(t))
return temp;
}
return null;
}
分块查找
基本思想
- 属于顺序查找的改进方法,又叫索引顺序查找。
- 将n个元素分成m块(m<=n),每个块中元素可以没有顺序,但是m个块之间是有序排列,所以特别适合于节点动态变化的情况。
- 分块查找的速度虽然不如二分查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序。当节点很多且块数很大时,对索引表可以采用折半查找,这样能够进一步提高查找的速度。
- 那么索引表的构成就是每个块中的最大元素。
- 查找方式是先对索引表进行二分或顺序查找,选出目标值应该所在的块,然后在块内进行顺序查找。
二分查找
基本思想
- 属于有序查找算法,也叫折半查找,就是将数组每次选取一半进行查找,怎么选取一半就需要让中间值与目标值value进行比较,因为有序,所以中间值小于目标值则选取后半部分,大于目标值则选取前半部分,依此类推,直到找出与目标值相等的元素,否则返回-1或null。
- 这种方法有效的缩减查找次数和查找范围,适用于数据量比较大的有序表。
- 因为前提是有序表,所以对于插入删除等操作过多的数据集并不适用,因为在排序算法上浪费的时间会比较多。
- 一般的时间复杂度是O(log2n)
- 有些同学使用二分法参加比赛,注意事项,(high+low)/2这种写法不严谨,因为如果high和low过大时容易产生溢出,mid可以改写成mid=low+(high-low)/2,或者使用位运算mid=low+((high-low)>>1。
代码实现
public int BinarySearch(int[] list,int value)
{
int low = 0,high = list.length-1,mid;
while (low<=high)
{
mid = (low+high)/2;
if(list[mid] == value)
return mid;
if(list[mid]>value)
high = mid-1;
if(list[mid]<value)
low=mid+1