![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
范玖九
塞翁失马 安知非福。
展开
-
数据结构—数据结构的概念,时间复杂度,空间复杂度
(一)数据结构与算法的区别数据结构:是计算机存储,组织数据的方式。指相互之间存在一种或多种特定关系的数据元素的集合。算法:算法就是一系列的计算步骤,用来将输入数据转化成输出结果。数据结构是数据元素的集合;算法是一系列的计算步骤。(二)算法的效率1. 时间效率(时间复杂度):衡量算法运行的速度(快慢)。2. 空间效率(空间复杂度):衡量算法运行所需要的额外空间。(三)时间复杂度...原创 2019-03-31 15:11:06 · 1420 阅读 · 0 评论 -
2--希尔排序
2.希尔排序思想:希尔排序是插入排序的改进,将一组数字按照特定规则分成若干组,在每组中进行插入排序;将排完序后的数字重新进行分组,再进行插入排序;分的组数由大到小,直到最后将所有数字分成一组。分组规则:gap表分得的组数gap = array.lengthgap = (gap/3)+1具体实现:先分组,每组进行插入排序分的组数 = gap=array.lengthg...原创 2019-05-08 21:20:59 · 137 阅读 · 0 评论 -
3--直接选择排序
3.选择排序思想:对于一组无序数字,每次选出一个最大值,将最大值放在当前无序数组的最后。选最大值的方法:定义一个最大值的下标,将初始最大值与当前无序数组中的数字依此比较,若遇到更大的值,最大值的下标改变,直到当前无序数组结束,将最大值与当前无序数组的最后一个元素交换位置,把最大值交换到后面。具体实现:遍历初始数组定义一个最大值的下标遍历当前无序数组,遇到比最大值大的元素,将最大值下...原创 2019-05-08 21:29:49 · 146 阅读 · 0 评论 -
数据结构—栈和队列的实现
(一)栈栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。栈一般使用数组实现。压栈:栈的插入操作,在栈顶进行。出栈:栈的删除操作,也在栈顶进行。图示:自己实现栈中的一些方法:方法作用isEmpty()判断栈是...原创 2019-07-30 17:05:41 · 178 阅读 · 0 评论 -
数据结构—树与二叉树的概念
树的概念:(1)数据结构中的树形结构是一种非线性的数据结构,它是一棵倒挂着的数,即根朝上,叶子朝下。(2)每个节点有0或多个子节点;(3)没有父节点的节点称为根节点;(4)每个子节点有且仅有一个父节点;(5)没有子节点的节点称为叶子节点。节点的度:一个节点的子树的个数;叶节点:度为0的节点;非叶子节点:度不为0的节点;父节点:若一个节点含有子节点,则这个节点称为其子节点的父...原创 2019-07-26 16:33:00 · 658 阅读 · 0 评论 -
5--冒泡排序
思想:有一个数值数组,每次从下标为0的元素开始,与后一个元素进行比较,把值较大的元素交换到后面,然后再与下一个元素比较,交换…直到与当前数组的最后一个元素比较完。所以一趟排序是把当前数组中的最大值交换到最后。图示理解:具体实现:我们称数组中为排序的部分为无序数组,排好序的部分为有序数组。定义变量i表示有序数组的长度,定义变量j表示无序数组的长度,则j=array.length-i。...原创 2019-08-08 16:59:55 · 238 阅读 · 0 评论 -
6--快速排序(基准值法)
思想:选择一个基准值(选择区间最右边的数作为基准值)遍历整个区间,每个数都和基准值作比较,并且发生一定交换遍历结束后,使得比基准值小的数(包括等于)都在基准值的左边比基准值大的数(包括等于)都在基准值的右边分治算法分别对左右两个小区间进行同样的方式处理直到:小区间的size == 0 或者 size == 1(有序)图示:具体实现:代码实现:package www.so...原创 2019-08-08 22:23:54 · 3567 阅读 · 0 评论 -
7--归并排序
思想:将待排序序列分为两个子序列,再将两个子序列递归的继续分下去,直到序列有序,即序列中只有一个元素,再把所有有序子序列逐层合并为一个整体有序序列。(每次合并是将两个有序表合并成一个有序表)。图示:具体实现:把待排序序列分为两个子序列,然后让子序列继续分子序列。把由同一个序列分出来的两个子序列合并。申请内存空间,空间大小是两个已排序序列的和,用来暂时存放合并后的序列;设置两个...原创 2019-08-09 15:36:22 · 255 阅读 · 0 评论 -
常见排序的时间复杂度,空间复杂度,稳定性总结
原创 2019-08-09 16:19:03 · 1182 阅读 · 1 评论 -
1--直接插入排序
1.插入排序思想:对一组无序数字进行排序,每次取出一个数字进行插入排序, 已经排好序的数字为有序数组,剩下的数字为当前无序数组, 将每次取出的数字插入到有序数组的合适位置。具体实现:遍历无序数组,每次取出当前无序数组中的的第一个元素将取出的元素插入到有序数组中(1)遍历有序数组(从后往前遍历)(2)为当前元素找到合适的位置当前元素大于等于有序数组中的某个值时,遍历停止,即该元素找...原创 2019-05-08 21:19:15 · 270 阅读 · 0 评论 -
数据结构——判断链表是否是回文结构
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。什么是回文:正读,反读都一样的句子,字符串,数字串等例如:ABCBA,ABBA都是回文。思想:找到原链表的中间结点中间结点之后的所有结点形成一个新的mid链表;将mid链表反转,形成反转链表;对原链表 和反转链表...原创 2019-04-12 17:59:27 · 618 阅读 · 0 评论 -
数据结构——返回链表中的倒数第k个结点
输入一个链表,输出该链表中的倒数第k个结点。思想:双引用遍历,定义两个引用p1,p2,第一个引用比第二个引用先走k步,则p1,p2一直相差k个结点,当p1遍历结束时,p2就是倒数第k个结点。注意存在该链表中可能根本就没有k个结点的情况,此时返回空。具体实现:如果链表为空,直接返回null;定义变量(1)定义变量 cur 表示当前变量;cur = head;(2)进行双引用遍历...原创 2019-04-12 16:49:19 · 391 阅读 · 0 评论 -
数据结构(2)——冒泡排序,二分查找
(一)冒泡排序冒泡排序的概念:将一串无序数字按照由小到大的顺序排列。冒泡排序的思想:两个相邻的数依此比较,保证大数在后面。 (1)第一次查询:i: 将第一个数与第二个数比较,如果第一个数比第二个数大,则将第一个数与第二个数交换位置;ii: 将第二个数与第三个数比较,如果第二个数比第三个数大,则将第二个数与第三个数交换位置;iii: 以此类推。。。直到与第n个数进行比较。(2...原创 2019-03-31 20:32:50 · 369 阅读 · 0 评论 -
数据结构—顺序表详解
目录(一)线性表的介绍(二)顺序表(一)线性表的介绍线性表:线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。(1)逻辑上是线性结构,物理...原创 2019-04-05 21:03:57 · 6351 阅读 · 0 评论 -
数据结构——反转一个单链表(基于Java语言实现)
反转一个单链表示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL思想:先准备一个新的链表作为结果链表,遍历原链表,每遍历一个节点,就把该节点首插到结果链表中。主要步骤是:(1)遍历(2)首插具体实现:定义变量(1)定义 cur 变量作为当前节点,cur = head...原创 2019-04-10 20:34:09 · 204 阅读 · 0 评论 -
数据结构——移除链表元素(基于java语言实现)
删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5方法1:遍历原链表中的节点,判断每个节点的value值;定义一个 cur 变量表示当前节点;把value值不等于val的节点尾插入一个新的空链表;(1)定义一个result ...原创 2019-04-10 19:51:32 · 833 阅读 · 3 评论 -
数据结构——将两个有序链表合并为一个新的有序链表并返回。(基于Java语言实现)
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思想:从两个有序链表的第一个结点开始比较,val值小的结点尾插入结果链表。具体实现:定义变量(1)定义变量 cur1,cur2 分别表示两个链表;(2...原创 2019-04-10 22:34:42 · 2353 阅读 · 0 评论 -
数据结构——链表的中间结点(LeetCode876)
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val...原创 2019-04-12 11:18:40 · 223 阅读 · 0 评论 -
数据结构—单链表详解
1. 链表链表:逻辑上是线性关系,物理存储上不一定是线性关系。可以理解为链表的一个结点由两部分组成:存放的数据找到下一个结点的线索。引用{value,next}简单理解:@0xFF {1,@0xCC}@0xCC {2,@0x99}@0x99 {3,@0x33}@0x33 {4,@0xAA}@0xAA{5,NULL}Node p1 = @0xFFNode p...原创 2019-04-09 12:14:30 · 738 阅读 · 0 评论 -
数据结构——分割链表
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。思想:1.遍历原链表,将小于 x 的结点尾插到一个新的链表中,将大于 x 的结点尾插到另一个新的链表中;2. 将两个新链表连接起来就是重新排列后的链表。具体实现:如果原链表...原创 2019-04-12 16:24:32 · 456 阅读 · 0 评论 -
双向链表的实现
双向链表:既能指向前一个节点,也能指向后一个节点。双向链表的图示双向链表的方法实现原创 2019-08-10 15:58:43 · 771 阅读 · 0 评论