查找元素的几种常用方法
- 1.顺序查找
- 2.折半查找
- 3.分块查找
1.顺序查找
顺序查找的思想很简单,就是遍历数组,和需要查找的元素进行比较,直到匹配为止。

int OrderFind(int arr[], int value){
int index = 0; //value值对应数组的索引
for (int i = 0; i < arr.length; i++)
{
if (arr[i] == value)
{
index = i;
break;
}
}
return index+1;
}对于这个算法,最好的情况很显然就是需要查找的元素在第一个位置,所以时间复杂度为O(1)
最坏的情况就是需要查找的元素在最后一个位置,所以时间复杂度为O(n)
很显然平均复杂度为O(n/2)
2.折半查找
折半查找对数组的要求有点高,就是需要数组是已经排好序的。算法思想就是首先确定中间值(一开始为数组索引最中间的那个数),然后和需要查找的元素进行比较大小,如果小于,则放到小于中间值的区域,反之则进行相反的操作,然后又进行同样的操作,直到区域的左右区间相等(如果此时仍没有找到需要查找的元素)。

int FindByHalf(int[] arr,int left,int right,int value){
int middle = (left+right)/2;
if(left > right){
System.out.println("没有找到元素!");
return -1;
}
if (value == arr[middle]){
return middle;
}
else {
if(value > arr[middle]){
return FindByHalf(arr, middle+1, right, value);
}
else {
return FindByHalf(arr, left, middle-1, value);
}
}
}3.分块查找
分块查找是顺序查找的一个改进。分块查找的思想就是将n个数据元素“按块有序”划分为m块(m<=n)。每一块中的数据元素不必有序,但块与块之间必须“按块有序”,即第1块中的最大的元素必须小于第2块中最小的元素;而第2块中最大的元素又小于第3块中的最小的元素,如此反复。然后在每一块中找出最大的元素和它的索引,建立一个索引表。因为索引表是有序的,如果说索引表很长的话,可以采用折半查找来查找被查找的元素在哪一块区域,然后在区域中通过顺序查找来查找对应的元素。
int BlockFind(HashMap<Integer,Integer> I,int b,int n,int arr[],int value)
{
int number; //每一块的元素个数
if ( n % b == 0)
number = n / b;
else
number = (n /b) + 1;
int low = 0, high = b-1,mid,i;
while (low <= high)
{
mid = (low + high)/2;
if (I.get(mid) >= value)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
i = (high + 1) * number;
while (i < (high + 2) * number && arr[i] != value && i < arr.length) //i < arr.length是为了防止最后一组越界
{
i++;
}
if (i < (high + 2) * number)
{
return i+1;
}
else
{
return -1;
}
}由于博主的水平限制,可能会有一些问题,希望大家指正。
















