本文简单介绍一下7中查找算法,首先查找就是根据给定的值,在查找表中找到它的位置。
查找算法的分类:
- 静态查找和动态查找(都是针对查找表而言的。动态表示查找表中有增删操作)
- 无序查找和有序查找(有序查找要求必须为有序数列,无序则不要求)
平均查找长度(ASL):需要和目标关键字进行比较的次数
对于含有n个数据元素的查找表,查找成功的平均查找长度为:ASL = Pi*Ci的和。
Pi:查找表中第i个数据元素的概率。
Ci:找到第i个数据元素时已经比较过的次数。
顺序查找
说明: 顺序查找适用于线性表
基本思想:无序查找算法。依次扫描线性表,将关键字和给定值k比较
时间复杂度:O(n)
代码如下:
private static int sequenceSearch(int[] arr, int target) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
二分查找
说明:查找表必须是有序的,适用于静态表,动态表插入删除时要维护有序需要额外的开销,不建议在动态表中使用
基本思想:又称折半查找,有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
时间复杂度:O(logn)
代码如下:
private static int binary(int[] arr, int low, int high, int value) {
//迭代法
int mid, index = -1;
while (low <= high) {
mid = (high + low) / 2;
System.out.println("low" + low + "high" + high + "mid" + mid);
if (value > arr[mid]) {
low = mid + 1;
} else if (value < arr[mid]) {
high = mid - 1;
} else {
index = mid;
break;
}
}
return index;
}
private static int binaryRecu(int[] arr, int low, int high, int value