数据结构与算法
且-听风吟.
这个作者很懒,什么都没留下…
展开
-
排序算法之基数排序
排序算法之基数排序基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。代码实现: //基数排序 public static void radixSort(int原创 2021-05-31 13:36:55 · 54 阅读 · 0 评论 -
希尔排序
排序算法之希尔排序希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。public static void main(String[] args) { int []arr = new int[]{5,2,7,3,7,2,6,0,1,6,9,4}; shellSort(arr); System.out.println(Arrays.toStr原创 2021-05-21 21:04:48 · 52 阅读 · 0 评论 -
二叉排序树
二叉排序树二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。比节点的小的子节点是左节点,比节点大的子节点是右节点。定义一:一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树;(4)没有键值相等的结点。定义二编辑原创 2021-05-17 15:29:37 · 268 阅读 · 0 评论 -
二叉平衡树
平衡二叉树平衡二叉树又称为AVL树平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。一棵AVL树有如下必要条件:条件一:它必须是二叉查找树。条件二:每个节点的左子树和右子树的高度差至多为1。构建平衡二叉树 单旋转与双旋转当插入节点是左左(LL)型时右右型左右型右左型代码实现:节点类:public class TreeNode { int va原创 2021-05-17 15:11:51 · 295 阅读 · 0 评论 -
二叉树遍历
二叉树的先序、中序、后序遍历 递归、迭代实现递归:先序public void PreOrder(TreeNode root){ if(root == null) return; System.out.println(root.val); if(root.left != null ){ PreOrder(root.left); } if(root.right != null){ PreOrder(root.right); }}中序:public void InOrder(Tr原创 2021-05-16 20:44:11 · 45 阅读 · 0 评论 -
直接插入排序
八大排序之插入排序数据结构排序算法可视化网址:https://visualgo.net/zh/sorting直接插入排序基本思想:每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。插入排序默认前面的序列已经是排好的,从第一个开始,当前的元素依次和前面的数比较,直到找到自己的位置插入去,而比这个元素大的就会往后移代码实现:public class InsertSort { public static void main(String[] args) {原创 2021-05-15 21:30:53 · 92 阅读 · 0 评论 -
快速排序
八大排序之快速排序快速排序的思想:快速排序是属于交换类型排序,采用不断的移动和比较来进行排序,快速排序是一种非常高效的排序算法,它的实现,增大了记录和比较和移动的距离,从而减少总的比较此时和移动次数。采用分而治之的思想,将一个大的问题拆成一个小的问题,小的问题拆成更小的问题。快速排序动画网址:https://visualgo.net/zh/sorting快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部原创 2021-05-15 21:24:47 · 64 阅读 · 0 评论 -
排序---堆排序
八大排序之堆排序:大顶堆实现升序,把大的元素移动到堆顶,然后拿出来放在后面我们对上面的图中每个数都进行了标记,上面的结构映射成数组就变成了下面这个样子还有一个基本概念:查找数组中某个数的父结点和左右孩子结点,比如已知索引为i的数,那么1.父结点索引:(i-1)/2(这里计算机中的除以2,省略掉小数)2.左孩子索引:2*i+13.右孩子索引:2*i+2存在数组:固定最大值再构造堆代码实现:public static void main(String[] args) {原创 2021-05-13 22:01:20 · 78 阅读 · 0 评论 -
数据结构---二叉树
数据结构之二叉树:树的最大层次称为树的深度节点拥有的子树数量称为节点的度度为0的节点都称为叶子节点二叉树的定义: 每个节点至多只有两棵子树,(即二叉树中不存在大于度大于2的节点,并且二叉树的子树有左右之分)二叉树的第i 层至多有 2^(i-1)个节点深度为k 的二叉树至多有 2^k -1个节点满二叉树: 一颗深度为 k 且 有 2^k -1个节点的二叉树称为满二叉树(完全对称) 除了叶子节点,其他每个节点都要两个子节点完全二叉树: 所有叶子节点都在最后一层或者原创 2021-05-12 22:23:21 · 123 阅读 · 0 评论 -
选择排序
排序算法之选择排序:java实现:选择排序( Selection sort)是一种简单直观的排序算法。它的工作原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序算法通过选择和交换来实现排序,其排序流程如下:(1)首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换。(2)接着从剩下的n-1个数据中选择次小的1个元素,将其和第2个位置的数据交换(3)然后,这样不断重复,直到最后两个数据完成交换。最后,便完原创 2021-05-09 21:15:43 · 56 阅读 · 0 评论 -
冒泡排序
排序算法之冒泡排序Java实现:1、冒泡排序:冒泡排序的思想是 比较相邻的两个数,大的数就往后排序,一直排到最后一项,然后又重第一项开始比较,只不过比较的次数会少一次,因为最大的已经到最后了,不用再比较。重复多少次就少比多少次2、代码实现://冒泡排序 每次碰到大的就往后排 public static void bubbleSort(int []arr){ //因为不和自己比较,所以是 arr.length-1 ,控制一共比较多少轮 for (in原创 2021-05-09 21:01:37 · 45 阅读 · 0 评论 -
递归小Demo
递归思想:递归的基本思想就是把规模大的问题转化为规模小的相似的子问题来解决递归的三要素1、明确递归终止条件;2、给出递归终止时的处理办法;3、提取重复的逻辑,缩小问题规模。几个递归小demo:1、一个简单的递归方法:public static void main(String[] args) { Print(4); } //递归三部曲:1、找停止条件 2、找返回值 3、本级递归应该做的事 public static void Print(int a原创 2021-05-08 19:26:09 · 383 阅读 · 0 评论 -
递归算法实现链表两数相加
LeetCode2题:链表两数相加递归实现思路:递归,就是在一个方法了不断调用自己。使用递归,明确三点:1、递归终止的条件2、找返回值3、本级递归应该做什么递归只关心本一级需要做什么,而不需要想下一步做什么,即使可能存在很多步,只需想明白一步,因为许多步都是这一步的重复分析题目:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数原创 2021-05-08 17:35:36 · 317 阅读 · 1 评论 -
数据结构---队列
数据结构之队列:1、概述队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列的特点:先加先出:FIFO在队尾插入元素,在队头删除元素循环队列的实现:队满条件: front = (rear+1)%N插入元素时,队尾指针: rear = (rear+1)%N删除元素时,队头指针: front = (front+1)%N队列中的原创 2021-05-08 17:02:40 · 51 阅读 · 0 评论 -
数据结构---栈
数据结构之栈:1、概述:栈(stack):是线性表的一种,限制仅在线性表的一端进行插入和删除操作。其中允许插入和删除的一端称为栈顶(top),不允许插入和删除的一端称为栈底(bottom)。栈的特点:先进后出、后进先出:先进去的数据在底部,最后被取出,后进去的数据在顶部,最先被取出栈的常用操作:s=Stack() 创建栈s.push(item) 将数据item放在栈的顶部s.pop() 返回栈顶部数据,并从栈中移除该数据s.peek()原创 2021-05-08 16:42:53 · 63 阅读 · 0 评论 -
数据结构--数组
线性结构------------------数组数组的定义:数组是在内存中存储相同数据类型的连续的空间声明一个数组就是在内存空间中划出一串连续的空间数组长度一旦声明,不可改变不可追加数组名代表的是连续空间的首地址通过首地址可以依次访问数组所有元素元素在数组中的排序叫做下标从零开始面对对象的数组:编写一个数组类MyArray,编写数组的一些方法package cn.StructureCode.数组;public class MyArrayImpl{ //用于存储数据的数组原创 2021-04-29 11:59:29 · 78 阅读 · 0 评论