![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
衡木
知道的越多,不知道的越多
展开
-
【数据结构】使用 Java 实现栈
栈示意图先进后出使用 Java 实现栈public class MyStack { // 用一个数组作为栈的底层 private int[] elements; /** * 构造一个空的栈 */ public MyStack() { elements = new int[0]; } /** * 压栈 * * @param e */ public void pu原创 2020-06-19 18:05:29 · 567 阅读 · 0 评论 -
【数据结构】使用 Java 实现双向循环链表
双向循环链表Java 实现双向循环链表public class DoubleLoopNode { /** * 前一个节点 */ DoubleLoopNode pre = this; /** * 后一个节点 */ DoubleLoopNode next = this; /** * 数据 */ int data; /** * 构造方法 * * @para原创 2020-06-19 17:59:12 · 364 阅读 · 0 评论 -
【数据结构】Java 实现循环链表
循环链表循环链表定义单向循环链表就是单链表的另外一种表现形式,其结构特点是最后一个指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环,就像将一根铁链子首尾连接形成一个铁链环一样。与单链表的区别单链表只存储后一个节点,到了尾节点就结束了,这样就无法找到他的前驱节点了Java 实现循环链表public class LoopNode { /** * 数据 */ private int data; /** * 下一原创 2020-06-19 17:54:28 · 572 阅读 · 0 评论 -
【数据结构】使用 Java 实现单链表
链表链表定义n个节点离散分配,彼此通过指针相连,每个节点只有一个前驱节点,每个节点只有一个后续节点,首节点没有前驱节点,尾节点没有后续节点。链表优点插入删除快链表缺点存取速度慢Java 实现单链表public class MyNode { /** * 链表保存的数据 */ private int data; /** * 链表的下一个节点 */ private MyNode next; /**原创 2020-06-19 17:47:55 · 300 阅读 · 0 评论 -
【排序算法】- 基数排序
排序动图排序思路将数组按基数进行排序,个位,十位,百位…排序流程取数组中最大的数,并计算位数从最低位开始取每个位的数组成一个新的数组对新的数组重新按位排序,直到位数排完代码实现public static void radixSort(int[] arr) { // 找出最大的数 int max = Integer.MIN_VALUE; for (int i = 0; i < arr.length; i ++) { if (arr[i] &g原创 2020-06-19 17:38:38 · 153 阅读 · 0 评论 -
【排序算法】归并排序
排序动图排序思路将数组分为两个长度为 n/2 的子序列,将这两个子序列合并为一个有序的序列。排序流程创建一个临时数组,存放合并后的序列设定两个起始值,分别是两个排好序的序列初始位置比较两个起始值位置的值,小的放入临时数组,并移动到下一个位置重复第三步,直到某个序列排序剩下的另一段序列复制到数组尾部代码实现public class MergeSort { public static void main(String[] args) { int[] arr =原创 2020-06-19 15:51:48 · 122 阅读 · 0 评论 -
【排序算法】选择排序
排序动图排序思路每一轮找出最小的,放在起始位置。排序流程总共遍历几次?因为最后一个元素也可能不是最小的,所以要遍历 n 次每次遍历需要干什么?找出最小元素的位置,与开始位置交替元素代码实现public static void selectSort(int[] arr) { // 总共需要遍历 n 次,每个元素都需要遍历 for (int i = 0; i < arr.length; i++) { // 默认第 i 个元素最小原创 2020-06-19 12:25:35 · 149 阅读 · 0 评论 -
【排序算法】希尔排序
排序动图排序思路将数组进行增量分组,对每个分组进行插入排序,然后依次缩减增量再排序,直到增量为1,进行最后依次插入排序。排序流程按增量分组,增量:d = arr.length / 2,加入 arr.length 为 10,则分组为:5 2 1遍历所有元素,按分组进行插入排序实现代码public static void shellSort(int[] arr) { // 遍历所有的分组情况 for (int i = arr.length / 2; i > 0; i /原创 2020-06-19 11:59:19 · 196 阅读 · 0 评论 -
【排序算法】插入排序
排序动图排序思路将一个元素插入到前面已经排好序的队列中,保证插入元素之后新队列依旧是有序的。排序流程第一次循环,从第二个数开始处理。当第二个数大于第一个数时,将第二个数放在第一个数后面一个位置,否则,将第二个数放在第一个数前面。第二次循环,处理第三个数,此时前面两个数已经是一个有序的数据了,首先比较第三个数和第二个数,当第三个数大于第二个数时,结束此次循环, 否则,将第二个数放在第三个数的位置,再比较第三个数和第一个数,如果小于,则将第一个数再放第二个位置,结束循环,将第三个数放在第一个位置。原创 2020-06-19 09:51:59 · 122 阅读 · 0 评论 -
【排序算法】快速排序
排序动图排序思路设定一个初始值,和两个位置,将初始值与这两个位置比较,大的放右边,小的放左边,这样经过一次循环遍历,就能把初始值放中间,比初始值小的在左边,比初始值大的在右边,再通过递归排序左边和右边的就可以排好序了。排序流程设置两个初始的变量low、high,初始值为:low = 0,j = N - 1;以第一个数组元素作为比较数据,赋值给 startVal,即 startVal = arr[0]从 hight 开始向前比较,high–,找到一个比 startVal 小的,将 arr[lo原创 2020-06-19 08:59:55 · 209 阅读 · 0 评论 -
【排序算法】冒泡排序
排序 Gif 图排序流程依次比较向相邻两个数,如果后面的比前面大,则交换位置。总共比较几轮?总共比较 n-1 轮,因为最后一个数字没有后一个数。每一轮比较几次?第一轮需要比较 n-1 次。第二轮需要比较 n-2 次,因为最后一个数已经是最大的了,不需要再重新比较。由此可得出,每轮比较 n - 已经比较了几轮 - 1。初始数组:int[] arr = new int[]{3, 2, 5, 1, 6, 8, 9, 4, 7}第一轮第一次:2 3 5 1 6 8 9 4 7第一轮第二原创 2020-06-18 21:53:02 · 138 阅读 · 0 评论