顺序查找
基本思想
属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值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(log2 n)
有些同学使用二分法参加比赛,注意事项,(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