
数据结构与算法
CoderLin很忙
欢迎来到ABC时代~
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode之旅(持续更新~)
两数之和https://leetcode-cn.com/problems/two-sum/思路:增加一个Map,用来记录已经遍历过的数字及其对应的下标。遍历原数组中每一个数字,如果目标值与当前数字的差值在Map中不存在时则用Map记录当前数字和对应下标,当目标值与当前数字的差值能在Map中找到时,则返回该差值对应的下标和当前数字在数组中的下标。public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map.原创 2020-07-24 11:59:58 · 280 阅读 · 0 评论 -
冒泡排序(Java实现及其改进)
依次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来。如升序:如果第一个比第二个大就交换,对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对)。 时间复杂度O(N^2),稳定排序算法。 public static void bubbleSort(int[] a){ for(int i = 0; i &amp;amp;lt; a.length - 1; i++){ ...原创 2018-09-14 21:02:06 · 1182 阅读 · 0 评论 -
插入排序(Java实现)
将待排序中的一个数插入到已排好序的数据中的适当位置上,从而得到一个新的有序数据。 时间复杂度O(N^2),稳定的排序算法。 当数组元素部分有序时,效率变高。 public static void insertionSort(int[] a){ int N = a.length; for(int i = 1; i < N; i++){ ...原创 2018-09-14 19:54:22 · 546 阅读 · 0 评论 -
构造二叉查找树(Java实现)
一颗二叉查找树(BST)是一颗二叉树,每个结点的键都大于其左子树中的任意结点而小于右子树的任意结点,在Java实现中每个结点都含有一个Comparable的键(以及相关联的值)。二叉查找树类似于快速排序,跟结点就是快速排序的第一个切分元素,左侧的键都比它小,右侧的键都比它大,对于所有子树同样适用,这和快速排序中对子数组的递归排序完全对应。在由N个随机键构造的二叉树中查找和插入平均所需比较次数为...原创 2018-09-18 21:02:01 · 1833 阅读 · 0 评论 -
无序链表实现顺序查找(Java实现)
链表中的每个结点存储一个键值对,get()的实现即为遍历链表,equals()方法比较需要被查找的键和每个结点中的键,如果匹配成功就返回相应的值,否则返回null。put()的实现也是遍历链表,用equals()方法比较需要被查找的键和每个结点中的值,如果匹配成功就用第二个参数指定的值更新和该键相关联的值,否则我们就用给定的键值对创建一个新的结点并将其插入到链表的开头。Java实现代码如下:p...原创 2018-09-18 20:44:13 · 733 阅读 · 0 评论 -
基于堆的优先队列(Java实现)
优先队列的最重要的操作:删除最大元素(或最小)和插入元素。数据结构二叉堆能够很好的实现队列的基本操作。二叉堆的结点按照层级顺序放入数组,用长度为N+1的私有数组pq来表示一个大小为N的堆(堆元素放在pq[1]至pq[N]之间,为方便计数,未使用pq[0]),跟节点在位置1,它的子结点在位置2和3,以此类推。位置k的节点的父节点位置为k/2,它的两个子节点位置分别为2k和2k+1。当一颗二叉树的...原创 2018-09-18 20:13:19 · 2575 阅读 · 2 评论 -
堆排序(Java实现)
堆排序指利用堆这种数据结构的一种排序算法,是选择排序的一种。 如果是非降序排序,需要使用大根堆(是完全二叉树),即每个节点的值都不大于父节点的值。将二叉树的节点按照层级顺序放入数组,用长度为N+1的私有pq[]来表示一个大小为N的堆(为后面计数方便,不使用pq[0],堆元素放在pq[1]至pq[N]之间),根节点在位置1,它的子节点在位置2、3,以此类推。位置k的节点的两个子节点位置分别为2k和2...原创 2018-09-18 19:37:57 · 4676 阅读 · 3 评论 -
二分查找(Java实现)
二分查找又称为折半查找,要求线性表必须采用顺序存储结构,并且元素按关键字有序排列。查找过程:假设数组中元素按升序排列,将数组中间位置的值与待查值比较,如果相等则查找成功;否则利用中间位置下标将数组分成前后两个子数组,如果中间位置的值大于待查值则到前一子数组中查找,如果中间位置的值小于待查值则到后一子数组中查找。重复以上步骤,直到找到或查完数组所有元素(未找到)。时间复杂度O(logN)。Jav...原创 2018-09-17 20:34:04 · 504 阅读 · 0 评论 -
归并排序(Java实现)
归并排序先递归地将数组分成两半分别排序,然后将结果归并起来,遵循分冶模式:分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。解决:使用归并排序递归地排列两个子序列。合并:合并两个已排序的子序列(归并排序的关键步骤)。时间复杂度为O(NlogN),空间复杂度O(N),稳定的排序(如果一个排序算法能够保留数组中重复元素的相对位置则被称为是稳定的)。经数学证明,所有基于比较的排...原创 2018-09-17 19:28:33 · 269 阅读 · 0 评论 -
希尔排序(Java实现)
希尔排序是对插入排序的改进,交换的是不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。希尔排序先使数组中任意间隔为h的元素都是有序的,这样的数组被称为h有序数组(一个h有序数组即一个由h个有序子数组组成的数组),在进行排序时,如果h很大,就能将元素移动到很远的地方,为实现更小的h有序创造方便。希尔排序又称“缩小增量排序”,对于每个h,用插入排序将h个子数组独立地排序,只需...原创 2018-09-17 19:04:57 · 3745 阅读 · 4 评论 -
快速排序(Java实现)及其改进(三向切分的快速排序)
快速排序思想:通过一趟排序将数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行。 一趟快速排序的步骤:设置两个变量:i = 0,j = N - 1;以第一个数组元素作为关键数据,赋值给key,即key=a[0](此时a[i]的值已有key保存,故i位置可被其他赋值);从j开始向前搜索(j–),找...原创 2018-09-16 23:57:02 · 682 阅读 · 0 评论 -
选择排序(Java实现)
选择排序:首先找到元素中最小的那个元素,其次,将它和第一个元素交换位置,再次,在剩下的元素中找到最小的元素和数组中第二个元素交换位置,如此往复,直到数组排序(每次从待排序元素中选择最小者或最大者)。Java代码实现:public static void selectionSort(int[] a){ int N = a.length; //每次寻找剩余元素中的最小值 f...原创 2018-09-03 20:33:10 · 6438 阅读 · 1 评论 -
链表实现堆栈和队列
链表实现堆栈:栈的顶部即为链表头,实例变量first指向栈顶,当使用push()压入一个元素时会将该元素添加到表头,当使用pop()删除一个元素时会将该元素从表头删除,操作时间与元素个数无关。 Java代码如下:public class Stack<T>{ private Node first = null;//栈顶,即最近添加的元素 private int ...原创 2018-09-06 00:28:51 · 2361 阅读 · 0 评论 -
实现简单的算术表达式
这里用栈的数据结构实现算术表达式(简单起见,这里定义的是未省略括号的算术表达式,支持+、-、*、/)。E.W.Dijkstra在20世纪60年代发明了一个简单算法,用两个栈(一个用于保存运算符,一个用于保存操作数)完成了这个任务。表达式由括号、运算符和操作数组成,根据以下4种情况从左到右逐个将这些实体送入栈处理:1.将操作数压入操作数栈;2.将运算符压入运算符栈;3.忽略左括号;4.在遇...原创 2018-09-05 13:56:16 · 5010 阅读 · 1 评论 -
取球问题
有这么一个问题: 盒子里有n个球,A、B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个。 若每个人从盒中取出的球的数目必须是:1,3,7,8。轮到某一方取球时不能弃权,A先取球,然后双方交替取球, 规定最后取完球的人为胜方。假设两个都很聪明,每次都做出最有利于自己获胜的选择。 该题曾出现在某一年的蓝桥杯比赛上,不过我稍作了一些修改,如果想看蓝桥杯的原题,可原创 2016-05-23 17:37:11 · 1554 阅读 · 0 评论 -
递归解决全排列和幻方
何为全排列,我想这个就不用多解释了吧,如果真不知道,可以自行上网查询。现在的重点是如何编程实现它,简要介绍一下我的全排列的递归算法思想:若用字符数组a[n]来存储数据,先固定a[0]到a[k](k从0到n-1),再生成a[k+1]到a[n-1]的全排列(具体采用交换元素的步骤来实现)。 C代码如下#include<stdio.h>#include<string.h>void permute(原创 2016-05-22 11:58:30 · 726 阅读 · 0 评论 -
递归之求幂
刚开始学习用递归实现x的n次方时,其思想(或者递推式)一般如下: X^n = X * X^n-1(n > 0); X^n = 1(n = 0); C语言代码如下: //__int64为有符号8字节整数 __int64 power(int x, int n){ if(n == 0){//递归结束条件 return 1; } re原创 2016-05-14 13:09:36 · 3125 阅读 · 0 评论