![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Java常见数据结构
Dven
这个作者很懒,什么都没留下…
展开
-
2.3、查找-插值查找(有序查找)
简介插值查找:也属于有序查找。是基于二分查找,做的算法优化。比如要在取值范围1 ~ 10000 之间 100 个元素从小到大均匀分布的数组中查找5,我们自然会考虑从数组下标较小的开始查找。经过以上分析,折半查找这种查找方式,不是自适应的(也就是说是傻瓜式的)。二分查找中查找点计算如下:mid=(low+high)/2, 即mid=low+(high-low)/2;通过类比,我们可以将查找的点改进为如下:mid=low+(key-arr[low])/(arr[high]-arr[low原创 2021-07-12 11:29:47 · 121 阅读 · 0 评论 -
2.2、查找-二分查找(有序查找)
简介二分查找:也称为折半查找,是有序查找算法。待查序列必须是有序的,如果是无序的则需要先进行排序操作。一、算法分析基本思想:用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。复杂度分析:最坏情况下,关键词比较次数为log(n+1),且期望时间复杂度为O(logn)。二、代码实现(Java)public cl原创 2021-07-12 11:16:32 · 204 阅读 · 0 评论 -
2.1、查找-顺序查找(无序查找)
简介顺序查找:也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。一、复杂度分析查找成功时的平均查找长度为:假设每个数据元素的概率相等,则ASL = 1/n * (1+2+3+…+n) = (n+1)/2 ;当查找不成功时,需要n+1次比较,时间复杂度为O(n)。所以,顺序查找的时间复杂度为O(n)。二、代码实现public c.原创 2021-07-12 11:09:01 · 963 阅读 · 0 评论 -
1.7、排序-堆排序(Heap Sort)
算法简介堆排序:是一种不稳定的排序算法。因为在堆的调整过程中,关键字进行比较和交换所走的是该结点到叶子结点的一条路径,因此对于相同的关键字就可能出现排在后面的关键字被交换到前面来的情况。相关堆的概念:堆是一棵顺序存储的完全二叉树。小根堆:其中每个结点的关键字都不大于其孩子结点的关键字。大根堆:其中每个结点的关键字都不小于其孩子结点的关键字。步骤一 构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。完全二叉树通过一维数组(数组起始索引为0)来存原创 2021-07-12 10:08:10 · 191 阅读 · 0 评论 -
1.6、排序-归并排序(Merge Sort)
算法简介归并排序:是建立在归并操作上的一种有效的排序算法。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。归并排序适用于数据量大,并且对稳定性有要求的场景。一、算法步骤1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列2、 设定两个指针,最初位置分别为两个已经排序序列的起始位置3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置4、重复原创 2021-07-12 09:53:18 · 99 阅读 · 0 评论 -
1.5、排序-快速排序(Quick Sort)
算法简介快速排序:是一种比较快速的排序算法,它的平均运行时间是 O(nlogn),之所以特别快是由于非常精练和高度优化的内部循环,最坏的情形性能为 O(n^2)。像归并一样,快速排序也是一种分治的递归算法。从空间性能上看,快速排序只需要一个元素的辅助空间,但快速排序需要一个栈空间来实现递归,空间复杂度也为O(logn)。一、算法步骤1、通过一趟排序,将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。2、然后,再按此方法对这两部分数据分别进行快速排序,整个排原创 2021-07-12 09:37:08 · 213 阅读 · 0 评论 -
1.4、排序-希尔排序(Shell Sort)
算法简介希尔排序:也称递减增量排序算法,是插入排序的一种更高效的改进版本。但是,希尔排序是不稳定排序算法。基本思想是:先将整个待排序的记录序列分割成为若干子序列,分别进行插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次插入排序。希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 O(n^2 ) 复杂度的算法快得多。时间复杂度 O(n^(1.3~2))空间复杂度 O(1)一、原创 2021-07-12 09:17:52 · 85 阅读 · 0 评论 -
1.3、排序-插入排序(Insert Sort)
算法简介插入排序:就是把当前待排序的元素,插入到一个已经排好序的列表里面。 一个非常形象的例子就是右手抓取一张扑克牌,并把它插入左手拿着的排好序的扑克里面。由于数组不可能在两个相邻的存储单元之间再插入一个单元,因此要将插入点之后的数据依次往后移动一个单元。插入排序的最坏运行时间是O(n2), 所以并不是最优的排序算法。特点是简单,不需要额外的存储空间,在元素少的时候工作得好。一、算法步骤假定排序结果要求是递增序列。1、首先认为第一个元素是容量为1的有序队列,剩余的元素组成无序队列。2原创 2021-07-12 08:31:19 · 182 阅读 · 0 评论 -
1.2、排序-选择排序(Select Sort)
算法简介选择排序:是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。比如序列【6,6,2】,第一次就将第一个【6】与【2】交换,导致第一个6挪动到第二个6后面,在排序的过程中改变了两个6的相对位置。时间复杂度: O(N^2)空间复杂度: O(1)一、算法步骤选择排序是每次循环找出最值,循环结束后将最值调整到对应位置,交换的次数少。假定排序结果要求是递增序..原创 2021-07-12 08:08:44 · 134 阅读 · 0 评论 -
1.1、排序-冒泡排序(Bubble Sort)
冒泡排序(Bubble Sort):是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素, 如果他们的顺序错误就把他们交互过来。走访数列的工作室重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。...原创 2021-07-11 18:59:10 · 349 阅读 · 0 评论