查找算法(第一弹)顺序查找和折半查找
顺序查找
算法描述
顺序查找又称为线性查找,是一种最简单的查找方法。适用于线性表的顺序存储结构和链式存储结构。该算法的时间复杂度为O(n)。
顺序查找是从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1。
优缺点
缺点:是当n 很大时,平均查找长度较大,效率低;
优点:是对表中数据元素的存储没有要求,可以是无序的。另外,对于线性链表,只能进行顺序查找。
我的代码实现(包含返回首值和返回所有值的数组两种方法):
1 package cn.ftf.mysearch;
2
3 import java.util.ArrayList;
4
5 /*
6 * 线性查找
7 */
8 public class MySeqSearch {
9 //只返回第一个的下标
10 public static int seqFirstSearch(int[] arr,int n) {
11 for(int i=0;i<arr.length;i++) {
12 if(arr[i]==n) {
13 return i;
14 }
15 }
16 return -1;
17 }
18 //返回包含所有下标的ArrayList集合
19 public static ArrayList<Integer> seqAllSearch(int[] arr,int n){
20 ArrayList<Integer> arrlist=new ArrayList<Integer>();
21 for(int i=0;i<arr.length;i++) {
22 if(arr[i]==n) {
23 arrlist.add(i);
24 }
25 }
26 return arrlist;
27 }
28
29 public static void main(String[] args) {
30 int[] arr= {1,3,3,5,7,8,8,8,8,9,10,123,134};
31 int res=seqFirstSearch(arr, 8);
32 System.out.println("Index= "+res);
33 ArrayList<Integer> arrlist=seqAllSearch(arr, 8);
34 System.out.println(arrlist.toString());
35 }
36
37 }
二分查找
算法描述:
二分查找(Binary Search),是一种在有序数组中查找某一特定元素的查找算法。查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则查找过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。
这种查找算法每一次比较都使查找范围缩小一半。
我的代码实现
public int binarySearch(int[] A, int target, int n){
int low = 0, high = n, mid;
while(low <= high){
mid = low + (high - low) / 2;
if(A[mid] == target){
return mid;
}else if(A[mid] > target){
high = mid - 1;
}else{
low = mid + 1;
}
}
return -1;
}
其中,有几个要注意的点:
- 循环的判定条件是:
low <= high - 为了防止数值溢出,
mid = low + (high - low)/2 - 当
A[mid]不等于target时,high = mid - 1或low = mid + 1
复杂度分析
时间复杂度:折半搜索每次把搜索区域减少一半,时间复杂度为 O(logn)
空间复杂度:O(1)

浙公网安备 33010602011771号