![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 52
JohnGea
这个人不懒,他写了简介
展开
-
归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。排序原理1.尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。2.将相邻的两个子组进行合并成一个有序的大组;3.不断的重复2步骤,直到最终只有一个组为止;基本思想:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进原创 2021-05-23 16:55:53 · 85 阅读 · 0 评论 -
冒泡排序
冒泡排序的原理:从头开始遍历,比较两个相邻的元素,如果前一个元素比后元素大,就交换位置,然后继续和下一个元素比较,将最大的元素放在最后的位置。每次遍历将这次遍历的最大元素放到最后的位置后,下次遍历就忽略这个已存放了最大元素的位置。即每遍历一次,遍历长度就减少一次。代码实现:public static void main(String[] args) { int arr[] = new int[25]; //排序前 System.out.println("排序前:")原创 2021-05-22 19:37:14 · 45 阅读 · 0 评论 -
选择排序
选择排序的工作原理:遍历前默认数组中的首元素为最小值;第一次遍历,找到最小元素的索引值并记录,遍历完毕后,将其与数组的第一个元素交换位置。第二次遍历,找到最小元素的索引值并记录,遍历完毕后,将其与数组的第二个元素交换位置。以此类推…代码实现:public static void main(String[] args) { int arr[] = new int[20]; //排序前 System.out.println("排序前:"); for (int原创 2021-05-22 19:30:39 · 186 阅读 · 0 评论 -
插入排序
插入排序是一种简单直观且稳定的排序算法。插入排序的工作方式:类似于我们在斗地主的是拿扑克牌,第一张默认是排好序的直接拿即可,再拿第二张如果比第一张小就会把第二张放在第一张的前面,以此类推,每次拿的牌如果比前一张小,就将其向前插,直到一手的牌都有序。排序原理把所有元素分为两组,已经排序的和未排序的;第一从首元素开始遍历,默认第一个元素是有序的,而后面都未排序。向后遍历,每次遍历一个就与前面已排好序组的开始从后向前比较(倒叙比较),直到找到其对应的插入位置。如果插入的位置是原已排好序原创 2021-05-22 19:25:37 · 79 阅读 · 0 评论 -
希尔排序
希尔排序使插入排序的一种,又称"缩小增量排序",是一种更加高效的插入排序在学习插入排序的时候,如果前面的一组元素都排好序,如{2,3,5,6},后面一组未排序的元素为:{1,0},那么下一个待插入的元素为1,我们需要将1和前面排好序的元素依次进行交换位置,才能完成插入。因此希尔排序是为了解决插入排序插入的数据比前面已排序的元素都小,需要前面元素逐个向后移动的问题。核心:对若干个数据进行分组并实现插入排序,分组的长度由数组的长度确定,每次遍历分组长度都要除2,直到分组量比1小。使用希尔排序,要确定原创 2021-05-22 19:11:27 · 87 阅读 · 0 评论 -
6.栈
栈的一个实际需求输入一个表达式(注意这里是整体输入一个表达式),如:[7*2*2-5+1-5+3-3]对于计算机而言,它接收到的是一个字符串,那么计算机是如何运算并得到结果的呢? —>栈栈的介绍栈的英文为:stack栈是一个先入后出的有序列表,(类比枪的弹夹)栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许元素插入和删除的一端称为栈顶,另一端为固定的一端,称为栈底。根据栈的定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除的元素正好相反原创 2021-05-21 16:08:17 · 55 阅读 · 0 评论 -
单向环形链表练习(约瑟夫环)
约瑟夫环:N个小孩围成一圈,从第一个开始报数,第M个小孩将出列,出列后从出列小孩的下一个小孩开始重新报数,报到第M个小孩再出列,依此类。根据人数个报数的数字统计出列顺序。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。思路:1.先创建一个first变量,指向链表的第一个节点;2.根据需求再创建一个辅助变量helper,helper在初始化时,应该指向环形链表的最后一个节点。3.根据需求,从第k个小孩开始报数,first和helper移动k-1次,使first指向第一个报数的小孩;原创 2021-05-21 08:37:29 · 110 阅读 · 0 评论 -
5.单向环形链表
单向环形链表就是将单向链表的最后一个节点的next指向第一个节点,从而构成一个环状链表如何构建一个单项环形链表?1.先创建第一个节点,让first指向该节点,使该节点的next指向first形成一个环。2.后面每遍历一个新的节点,就将原链表的最后一个节点的next指向新节点,而新节点的next指向first。首先需要创建一个节点类://创建一个节点类,每一个节点对象就是一个节点class CircleNode{ private int no; //编号 private .原创 2021-05-20 17:24:32 · 203 阅读 · 0 评论 -
4.双向链表
单链表的缺点分析:单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找;单项链表不能自我删除,需要靠辅助节点辅助删除,而双向链表可以实现自我删除在双向链表中,每个节点不仅存放了下一个节点的地址,还存放了上一个节点的地址,因此,在双向链表中,不仅可以实现顺序遍历,还可以实现逆序遍历。双向链表的操作:首先创建一个节点类,包含以下属性:(1)节点值:num(2)前驱节点:pre(3)后继节点:next//定义一个Node,每个Node对象就是一个节点class Nod原创 2021-05-20 15:06:59 · 130 阅读 · 0 评论 -
单链表练习题
1.求单链表中有效节点的个数逻辑代码://获取链表中有效节点的个数public int getLength(){ if (head.next == null){ return 0; } int len = 1; //头节点后面有节点,说明至少有一个,因此初始化为1; Node temp = head.next; //直接指向head的下一个,因为链表的长度不需要算头节点 while (true){ if (temp.nex原创 2021-05-18 17:27:03 · 371 阅读 · 0 评论 -
3.单链表
1.链表(Linked List)介绍链表是有序列表,但是列表的在内存中的存储方式却不一定是连续的:在这张图中我们可以看到,列表有一个头指针,这个头指针记录的是地址为150的值,我们找到150地址对应的值后a1后,a1也存放了一个next域,指向了下一个地址110…这样使得数据连接在一起,上一条数据都存放了下一个数据的地址的存储方式就称为链表。如果不好理解的话就来看这张吧:这张图描述了链表的一个逻辑结构,而第一张图描绘的是在内存中的实际结构,在内存中链表的节点不一定连续,但是它们可以通过自原创 2021-05-17 18:09:06 · 69 阅读 · 0 评论 -
2.队列
生活中我们有很多排队的场景,比如下课,我们排队买午饭,上课时我们排队进电梯,在排队的时候,我们也会遵守一个先到先得的规则:即我先到,我先排队,那么就是我先买饭/搭电梯;那么这样一个排队的方式我们就可以称其为一个队列,而我们所遵守的排队规则就是队列的先进先出原则。1、队列的介绍队列是一个有序的列表,可以用数组或者联表来实现;遵循先进先出原则。即:先存入队列的数据,要先取出。后存入的队列的后取出;用数组来模拟队列左边的这个队列中没有数据,因此front(队列头)和rear(队列尾)都指向一.原创 2021-05-16 16:10:50 · 265 阅读 · 0 评论 -
1.稀疏数组
1.概念我们来观察以下这张表,假设这是一个二维数组000000000000000100000000000000000000000000000000100000000000000000000000050000000000000000200000000000000原创 2021-05-16 10:42:40 · 58 阅读 · 0 评论