Java数据结构与算法
文章平均质量分 68
夏野和弦
hi~~~~~~
展开
-
图的源码、BFS和DFS
图的底层基础代码实现基础接口package _02_图._01_graph;import java.util.List;public interface Graph<V,E> { int edgesSize();//边的数量 int verticesSize();//顶点数量 void addVertex(V v);//添加顶点 void addEdge(V from, V to);//添加边 void addEdge(V from, V t原创 2021-03-04 17:39:26 · 246 阅读 · 2 评论 -
排序(八):希尔排序
排序算法系列文章排序(一):冒泡排序排序(二):选择排序排序(三):堆排序排序(四):插入排序排序(五):二分搜索排序(六):归并排序排序(七):快速排序目录排序算法系列文章希尔排序(Shell Sort)基本思想复杂度代码实现希尔排序(Shell Sort) 希尔序列步长序列待优化基本思想希尔排序是插入排序的一种改进,主要是为了解决当较小的数据大都出现在数组后面时导致的移动次数明显增多的问题,思想是使用一个不断缩小的增量gap将数组元素分组,在每个分组内部先进行插入排序,当ga原创 2021-03-03 20:26:24 · 187 阅读 · 2 评论 -
排序(七):快速排序
排序算法系列文章排序(一):冒泡排序排序(二):选择排序排序(三):堆排序排序(四):插入排序排序(五):二分搜索排序(六):归并排序排序(七):快速排序目录排序算法系列文章快速排序(Quick Sort)基本思想算法步骤轴点构造轴点构造--优化复杂度与稳定性快速排序代码实现快速排序(Quick Sort)基本思想快速排序(Quick Sort)是对冒泡排序的一种改进,采用的是分治策略(一般与递归结合使用),以减少排序过程中的比较次数。快速排序的本质:逐渐将每一个元素都转换成轴点元原创 2021-03-03 17:32:33 · 212 阅读 · 1 评论 -
排序(六):归并排序
排序算法系列文章排序(一):冒泡排序排序(二):选择排序排序(三):堆排序排序(四):插入排序排序(五):二分搜索排序(六):归并排序目录排序算法系列文章归并排序(Merge-Sort)基本思想算法步骤序列合并复杂度常见的递推式与复杂度查看表归并序列代码实现归并排序(Merge-Sort)基本思想归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,与快速排序一样,归并排序也是基于分治法的(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段原创 2021-03-03 15:49:25 · 168 阅读 · 1 评论 -
排序(五):二分搜索
排序算法系列文章排序(一):冒泡排序排序(二):选择排序目录排序算法系列文章二分搜索(Binary Search)思路代码实现二分搜索优化思路二分搜索(Binary Search)如何确定一个元素在数组中的位置?(假设数组里面全都是整数)如果是无序数组,从第0个位置开始遍历搜索,平均时间复杂度:O(n)如果是有序数组,可以使用二分搜索,最坏时间复杂度为O(logn)思路假设在[begin,end)范围内搜索某个元素 v,mid == (begin + end)/ 2①、如果v &l原创 2021-03-02 16:24:52 · 176 阅读 · 1 评论 -
排序(四):插入排序
排序算法系列文章排序(一):冒泡排序排序(二):选择排序目录排序算法系列文章插入排序(Insertion Sort)基本思想算法步骤复杂度代码实现插入排序(Insertion Sort)基本思想把n个待排序的元素看成为一个有序数组和一个无序数组。开始时有序数组中只包含一个元素,无序数组中包含有n-1个元素,排序过程中每次从无序数组中取出第一个元素,把它依次与有序数组的元素进行比较,将它插入到有序数组中的适当位置,使之成为新的有序数组,直到最后无序数组没有元素为止。算法步骤①在执行过程中,插入原创 2021-03-02 15:39:47 · 170 阅读 · 0 评论 -
排序(三):堆排序
排序算法系列文章排序(一):冒泡排序排序(二):选择排序目录排序算法系列文章堆排序(Heap Sort)算法步骤复杂度代码实现堆排序(Heap Sort)堆排序可以认为是对选择排序的一种优化。一般升序采用大顶堆,降序采用小顶堆。算法步骤①对序列进行原地建堆②重复执行以下操作,直到堆的元素数量为1交换堆顶元素与尾元素堆的元素数量减1对 0 位置进行 1 次 siftDown操作自下而上的下滤(siftDown)复杂度最坏,最好,平均时间复杂度均为O(nlogn)它原创 2021-03-02 11:16:34 · 143 阅读 · 0 评论 -
排序(二):选择排序
目录前言----十大经典排序算法选择排序(Selection Sort)算法步骤(升序)代码实现复杂度算法优化前言----十大经典排序算法以上表格是基于数组进行排序的一般结论冒泡、选择、插入、归并、快速、希尔、堆排序,属于比较排序(Comparison Sorting)选择排序(Selection Sort)算法步骤(升序)①从序列中找出最大的那个元素,然后与最末尾的元素交换位置;②执行完一轮后,最末尾的那个元素就是最大的元素;③忽略①中曾经找到的最大元素,重复执行步骤①代码实现原创 2021-03-02 10:26:37 · 166 阅读 · 0 评论 -
排序(一):冒泡排序
目录前言----十大经典排序算法冒泡排序(Bubble Sort)算法步骤代码实现代码优化①代码优化②复杂度排序算法的稳定性(Stability)原地算法(In-place Algorithm)前言----十大经典排序算法以上表格是基于数组进行排序的一般结论冒泡、选择、插入、归并、快速、希尔、堆排序,属于比较排序(Comparison Sorting)冒泡排序(Bubble Sort)冒泡排序(Bubble Sort)的基本思想是:通过对待排序数组从头到尾遍历(从索引较小的元素开始),依原创 2021-03-01 17:40:05 · 348 阅读 · 0 评论 -
非递归前序遍历二叉树、非递归中序遍历二叉树、非递归后序遍历二叉树
前言本文主要将前序遍历、中序遍历、后序遍历的非递归方法。递归方法和层序遍历请看 递归前序遍历、递归中序遍历、递归后序遍历、层序遍历和判断一棵树是否为完全二叉树非递归前序遍历二叉树第一种方法:利用栈实现1.设置 node = root2.循环执行以下操作如果 node != null ,对 node 进行访问,将 node.right入栈,设置 node = node.left如果 node == null,如果栈为空,结束遍历;如果栈不为空,弹出栈顶元素并赋值给 node代码:原创 2021-03-01 15:56:16 · 361 阅读 · 0 评论 -
递归前序遍历、递归中序遍历、递归后序遍历、层序遍历和判断一棵树是否为完全二叉树
目录递归前序遍历递归中序遍历递归后序遍历层序遍历(很重要)判断一棵树是否为完全二叉树递归前序遍历 /* * 递归 前序遍历*/ public void preorder(Visitor<E> visitor){ preorder(root,visitor); } private void preorder(Node<E> node, Visitor<E> visitor){ if (root == nu原创 2021-03-01 14:56:22 · 182 阅读 · 3 评论