数据结构
阿劼
"哦?你也在这里吗"
展开
-
单链表的基础操作
单链表:又名单向链表、线性链表,是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过从头部开始,依序往下读取。单向链表的数据结构可以分为两部分:数据域和指针域,数据域存储数据,指针域指向下一个储存节点的地址。下面以具体程序看看单链表的各种操作:基本操作:头插法、尾插法、指定位置插入元素、求长度、求倒数第k个元素、链表逆置。class Link{ E...原创 2018-05-02 23:19:24 · 220 阅读 · 0 评论 -
希尔排序
希尔排序: 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。先来复习一下插入排序的代码:public ...原创 2018-05-14 21:24:15 · 157 阅读 · 0 评论 -
快排的几种优化方案
聚集相同元素排序是快速排序的一种优化方案,它的思路是在经过一次找基准之后把数据中与基准相同的数据聚集到基准左右,这样就可以少进行几次递归找基准的过程,从而提高了运行效率。 看以下程序:import java.util.Arrays;public class FocusAlikeQuickSort { /** 找基准的方法,与前文相同 */ public static ...原创 2018-05-21 16:11:19 · 2031 阅读 · 0 评论 -
堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质: 即子结点的键值或索引总是小于(或者大于)它的父节点。堆节点的访问:通常堆是通过一维数组来实现的。在数组起始位置为0的情形中: ·父节点i的左子节点在位置 (2i+1)}; ·父节点i的右子节点在位置 (2i+2)} ; ·...原创 2018-05-21 18:08:56 · 134 阅读 · 0 评论 -
归并排序
归并排序(mergesort),是创建在归并操作上的一种有效的排序算法,效率为 O(n\log n)} O(n\log n)。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行,是将两个已经排序的序列合并成一个序列的操作。其时间复杂度是O(log₂n),空间复杂度是O(n)。 本文用迭代法实现归并排序操作。看程序:impo...原创 2018-05-21 18:20:58 · 193 阅读 · 0 评论 -
冒泡、选择、插入排序及优化
对于一维数组的排序,除了java底层提供的java.util.Arrays.sort()方法外,我们来看看另外的几种排序方式。1.选择排序法 选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大) 元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末 尾。...原创 2018-04-22 12:17:14 · 185 阅读 · 0 评论 -
快速排序的递归实现
快速排序(Quicksort),又称划分交换排序(partition-exchange sort),简称快排,是一种效率很高的排序算法。排序思路:·从数列中挑出一个元素,称为"基准"(pivot),·重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。 在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(part...原创 2018-05-15 23:49:29 · 1528 阅读 · 0 评论 -
栈与队列的互相实现
1、问题描述:栈是先入后出的数据结构,而队列是先入先出的数据结构,要求用两个数据栈实现数据的先入先出,即队列。在数据栈的包内实现:public class StackToQueue{ public static void entryQueue(Stack s1, int val){ // s1保存数据 s1.push(val); } ...原创 2018-05-22 15:49:03 · 113 阅读 · 0 评论 -
快速排序的非递归实现
前一篇文章我们看了怎样用递归实现快速排序,那么如果不用递归方法,又该怎么实现快速排序呢? 思路是这样的:第一次找完基准后,若基准左右两边都还未有序,则按照从左往右的次序把新的索引全部压入一个栈中。当栈中存在数据时,每次出栈两个元素作为新的结束索引和开始索引重新找一次基准,这样就类似于递归地实现了多次找基准的目的。同样的,找基准的代码是一样的:public static int pa...原创 2018-05-16 01:38:58 · 830 阅读 · 0 评论 -
约瑟夫环
问题描述:有n个人围成一个环循环报数,每次报数为m的人出局,剩下的人继续游戏,直到最后只剩一个人为止,返回胜利者的下标。思路: 设每个人的起始数据都是0,设置一个计数器,当计数器为3的时候把对应的人的数据设置为1,返回最后对应数据为0的人的下标。1.普通实现看程序:public class JosephTest{ public static in...原创 2018-06-14 18:22:34 · 119 阅读 · 0 评论 -
汉诺塔
问题描述: 据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。简单汉诺塔的迭代实现:public ...原创 2018-06-16 21:16:04 · 182 阅读 · 0 评论 -
费氏数列
问题描述: Fibonacci为1200年代的欧洲数学家 , 在他的着作中曾经提到 :若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子,三个月后有五只免子(小免子投入生产)......。这就是Fibonacci数列,一般习惯称之为费氏数列,例如以下: 1、1 、2、3、5、8、13、21、34、55、89....原创 2018-06-17 16:14:10 · 7175 阅读 · 0 评论 -
KMP算法
KMP算法: KMP算法是一种改进的字符串匹配算法,关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度为O(m+n)。算法思想: 当第一次匹配失败以后,我们不把主串的索引回到开始索引的后一位,而是保持不动,若子串中存在前后相同的情况,则索引就可以不用回到0...原创 2018-05-14 21:03:53 · 107 阅读 · 0 评论 -
BF算法
BF算法: BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。 ----@百度百科算法思想: 首先S[1...原创 2018-05-14 20:21:07 · 498 阅读 · 0 评论 -
两个单链表的相交判断
前面一篇文章介绍了链表存在环及环的各种操作,本文主要来看两个链表的相交操作。看以下代码:/** 链表类 */class Link{ Entry head = new Entry(); /** 节点类,用于节点初始化 */ class Entry{ int data; Entry next; publ...原创 2018-05-05 00:15:02 · 168 阅读 · 0 评论 -
带环的单链表
前面一篇文章介绍了单链表的一些基础操作,本文接着来看一些单链表的其他操作。判断单链表是否存在环,求环的入口节点,环的长度 看以下程序:/** 链表类 */class Link{ Entry head = new Entry(); /** 节点类,用于节点初始化 */ class Entry{ int data; E...原创 2018-05-03 23:57:53 · 326 阅读 · 0 评论 -
队列的链表实现
前面我们看了队列的数组实现,本文来看看用链表实现队列的方法。链式队列的出现:存储队列元素的数组大小是固定的,另外,队列的数组实现需要用特殊的方式处理数组(保留一个数组元素用于判断数组 是否已满),以及索引front和rear(计算front/rear时用(front/rear + 1 )% maxSize 操作)。而队列的链表实现简化了 数组实现的许多特殊情况,并且动态分配...原创 2018-05-11 00:12:29 · 1069 阅读 · 0 评论 -
优先级队列
如果我们给每个元素都分配一个数字来标记其优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列 这种数据结构。 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先级,对优先级队列执行的操作有查找、插入一个新元素 、删除 ;一般情况下,查找操作用来搜索优先级最高的元素,删除操作用来删除该元素 。对于优先...原创 2018-05-11 12:40:24 · 167 阅读 · 0 评论 -
两个有序单链表的合并
前面几篇文章介绍了单链表的一些基本操作、环的操作和链表的相交操作,本文来看看两个有序链表的合并问题。 问题描述:有两个链表,各自的数据大小有序,将他们合并为一个链表,并使数据大小有序。看以下代码:/** 链表类 */class Link{ public Entry head; public Link() { head = new En...原创 2018-05-05 00:49:34 · 404 阅读 · 0 评论 -
循环单链表
前面几篇文章介绍了单链表的一些操作,本文接着来看循环单链表的一些操作。循环单链表:链表中最后一个结点的指针不再是结束标志,而是指向整个链表的第一个结点,可以看做是以头结点为起点 的单链表环。看以下程序: /** 链表类 */ class Link{ Entry head; /** 初始化一个循环单链表 */ publ...原创 2018-05-05 01:36:46 · 345 阅读 · 0 评论 -
双向链表
双向链表的概念:双向链表:也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向 链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。来看看双向链表的一些操作。看以下程序:/** 链表类 */class DoubleLinkedList{ /** 节点类,用于节点初始化 */ ...原创 2018-05-05 02:06:34 · 108 阅读 · 0 评论 -
堆栈的数组实现
堆栈是由同类元素组成的表,其元素的删除与增加都只发生在一端,这一端称为堆栈的顶。 堆栈是一种先入后出的数据结构。看以下对于堆栈的操作:class Stack { int top; int [] arr; public Stack() { // 设置栈的大小是10 this(10); } public S...原创 2018-05-05 02:28:39 · 1170 阅读 · 0 评论 -
顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。也就是说像这样的: 像这样的: 还有像这样的: 嗯,介绍完了概念来看看顺序表的一些操作。看以下程序:import java.util.Arrays;class testSqlist { static int usedSize; int[] elem; // 初始化数组长度原创 2018-05-06 17:14:46 · 257 阅读 · 0 评论 -
堆栈的链表实现
链式栈的出现:因为数组的大小固定,所以在堆栈的数组(线性)表示中,只有固定数目的元素才能压入堆栈。如果 在程序中压入堆栈的元素数目超过数组大小 ,程序就会出错,链式栈就是为了解决这个问题。使用引用变量可以动态的分配内存空间,使用链表可以动态的组织数据。对于链式栈的各种操作类似于单链表的操作,看以下程序:class LinkStack{ /** 结点类,用于结点初始化*/ c原创 2018-05-06 23:04:18 · 654 阅读 · 0 评论 -
用堆栈实现“中缀表达式”转“后缀表达式”
逆波兰表示法是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。逆波兰表达式的解释器一般是基于堆栈的。 逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3原创 2018-05-07 00:39:09 · 773 阅读 · 0 评论 -
队列的数组实现
队列,又称为伫列(queue),是一种先进先出的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。 队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。看一下队列的基本操作:class QueueLink{ int[] arr; int front; int rear;原创 2018-05-06 23:42:39 · 318 阅读 · 0 评论 -
杨辉三角
问题描述: 杨辉三角形,又称贾宪三角形、帕斯卡三角形、海亚姆三角形、巴斯卡三角形,在中国首现于南宋杨辉的《详解九章算术》得名,书中杨辉说明是引自贾宪的《释锁算术》,故又名贾宪三角形。目前《详解九章算术》和《释锁算术》都收录在大英博物馆所藏的《永乐大典》(个人感觉蛮耻辱的)。1.迭代实现看程序:public class BascaTriangleTest { pub...原创 2018-06-18 17:35:03 · 305 阅读 · 0 评论