开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第二十二天,点击查看活动详情
前言:之前的文章给大家讲解了排序算法的几种排序算法,给大家总结一下排序算法的优劣对比,接下来给大家介绍查找算法~
排序算法对比
解释:
- 稳定:如果 a原本在 b前面,而a=b , 排序之后 a仍然在 b的前面;
- 不稳定:如果 a原本在 b的前面,而 a=b,排序之后 a可能会出现在 b的后 面;
- 内排序:所有排序操作都在内存中完 成;
- 外排序:由于数据太大,因此把数据 放在磁盘中,而排序通过磁盘和内存 的数据传输才能进行;
- 时间复杂度: 一个算法执行所耗费 的时间。
- 空间复杂度:运行完一个程序所需内 存的大小。
- n:数据规模
- k:“桶”的个数
- In -place:不占用额外内存
- Out -place:占用额外内存
查找算法
顺序(线性查找)查找
- 从头到尾一个一个进行对比查找,找到则返回下标
/**
* @author Kcs 2022/9/5
*/
public class SequenceSearch {
public static void main(String[] args) {
//数组
int[] arr = {1 ,-25, 45, 32, 3, 0, 12, -20};
int index = seqSearch(arr, 0);
if (index == -1) {
System.out.println("查无次数据");
} else {
System.out.println("该数字位于:" + index);
}
}
/**
* 找到一个就返回
* @param arr 匹配数组
* @param value 要查找的数
* @return index
*/
public static int seqSearch(int[] arr, int value) {
//逐一比对
for (int i = 0; i < arr.length; i++) {
if (arr[i] == value) {
return i;
}
}
return -1;
}
}
二分查找 / 折半查找
- 必须是顺序的数组,若是无序的,则需要先排序(小到大 / 大到小)
思路
(以下是排序已为由小到大)
-
首先确定该数组的中间下标
- mid = (left + right)/ 2
-
然后让需要查找的数 findValue 和 arr[mid] 进行比较
- findValue > mid[arr] :说明要查找的数在 mid 的右边,应该向右查找(向右递归查找)
- findValue < mid[arr] :说明要查找的数在 mid 的左边,应该向左查找(向左递归查找)
- findValue = mid[arr] :说明已经找到,则返回
-
退出递归
- 找到目标退出递归
- 找不到退出递归 (==left > right==)