常见算法
查找算法(7种)
- 基本查找
- 二分/折半查找
- 分块查找
- 插值查找(数据分布比较均匀,否则反而效率更差)
mid = min + (key-arr[min]) / (arr[max]-min) * (max-min)
- 斐波那契查找
mid = min + 黄金分割点左半边长度 - 1 注:黄金比例为1:0.618
- 树表查找
- 哈希查找
基本查找
核心:从0索引开始挨个往后查找
|
|
(折半/二分)查找
前提条件:数组中的数据必须是有序的
核心逻辑:每次排除一半的查找范围
- min和max表示当前要查找的范围
- mid是在min和max中间
- 如果要查找的元素在mid左边,缩小范围时,min不变,max等于mid减1
- 如果要查找的元素在mid右边,缩小范围时,max不变,min等于mid加1
|
|
分块查找
分块原则1: 前一块中的最大数据,小于后一块中的所有数据(块内无序,快间有序)
分块的原则2: 快数数量一般等于数字的个数开根号
核心思路:先确定要查找的元素在哪一块,然后在块内挨个查找
|
|
排序算法(10种)
- 冒泡排序
- 选择排序
- 插入排序
- 快速排序
- 希尔排序
- 归并排序
- 堆排序
- 计数排序
- 桶排序
- 基数排序
冒泡排序
-
相邻的数据两两比较,小的放前面,大的放后面
-
第一轮比较完毕之后,最大值已确定,第二轮可以少循环一次,后面以此类推
-
如果数组中有n个数据,总共需执行n-1轮代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public class BubbleSort { public static void main(String[] args) { //定义数组 int[] arr = {2, 4, 5, 3, 1}; for (int j = arr.length - 1; j > 0; j--) { for (int i = 0; i < j; i++) { if (arr[i] > arr[i + 1]) { int temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } } Tool.printIntArr(arr); } }
选择排序
原理:从0索引开始,拿着每一个索引上的元素跟后面的元素依次比较,小的放前面,大的放后面,以此类推
|
|
插入排序
原理:将数组分为有序和无序两组,遍历无序数据,将元素插入有序序列中即可
将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。
N的范围:0~最大索引
|
|
快速排序
原理:
- 将排序范围中的第一个数字作为基准数,再定义两个变量start,end
- start从前往后找比基准数大的,end从后往前找比基准数小的
- 找到之后交换start和end指向的元素,并循环这一过程,直到start和end处于同一个位置,该位置是基准数在数组中应存入的位置,再让基准数归位
- 归位后的效果:基准数左边的比基准数小,基准数右边的比基准数大
第一轮:把0索引的数字作为基数,确定基准数在数组中正确的位置
比基准数小的全部在左边,比基准数大的全部在右边
|
|
递归
定义:递归指的是方法中调用方法本身的现象
作用:把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
|
|