数据结构与算法
小雨喳
while( !success ){ Keep trying; }
展开
-
二分查找No.21
必须是一个有序数组 思路: 代码示例package mainimport "fmt"func BinarySearch(arr *[6]int,leftIndex int,rightIndex int ,findVal int ){ if leftIndex > rightIndex{ fmt.Printf("%v中找不到\t元素%v\n",(*arr),findVal) return } //先找到中间下标 midddle原创 2020-07-23 08:36:58 · 201 阅读 · 0 评论 -
归并排序No.20
一、归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之)。 基本思想 将序列中待排序数字分为若干组,每个数字分为一组 将若干个组两两合并,保证合并后的组时有序的 重复第二步操作直到只剩下一组,排序完成 ...原创 2020-07-22 20:44:15 · 174 阅读 · 0 评论 -
快速排序No.19
一、快速排序法介绍快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 基本思想 数据集中,选取一个元素作为'基准'(pivot)。 所有小于'基准'的元素,都移到'基准'的左边;所有大于'基准'的元素,都移到'基准'的右边。 对'基准'左边和右边的两个原创 2020-07-21 21:08:50 · 150 阅读 · 0 评论 -
希尔排序法No.18
一、希尔排序法基本思想希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含 的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。 增量一般都是从初始的元素总个数除以2,然后依次往下推。既:增量(初始时是元素总个数)=增量/2 将每组分成两个元素一组,分别进行插入排序,直到增量为1则对整个元素进行插入排序。 二、代码实现package main import "fmt"//希尔排序func shellSort(theA.原创 2020-07-14 22:39:26 · 171 阅读 · 0 评论 -
插入排序No.17
一、插入排序法介绍插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。 插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有 序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排 序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。 二、代码示例package mainimport...原创 2020-07-13 21:21:58 · 135 阅读 · 0 评论 -
选择排序No.16
一、基本介绍选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到 排序的目的。二、选择排序思想第一次从 arr[0]~arr[n-1]中选取最小值, 与 arr[0]交换 第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换 第三次从 arr[2]~arr[n-1]中选取最小值,与 arr[2] 交换 第 i 次从 arr[i-1]~arr[n-1]中选取最小值,与 arr[i-1]交换 第 n-1 次从 arr[n-2]~原创 2020-06-17 21:59:04 · 151 阅读 · 0 评论 -
冒泡排序No.15
一、基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志 flag 判断元素是否进行过交换。从而减少不必要的比较。二、演示冒泡过程的例子(图解)三、冒泡排序代码实现package mainimport原创 2020-06-16 21:09:26 · 275 阅读 · 0 评论 -
递归之八皇后问题No.14
一、八皇后问题介绍八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、 同一列或同一斜线上,问有多少种摆法(92)。 二、八皇后问题算法思路分析第一个皇后先放第一行第一列 第二个皇后放在第二行第一列、然后判断是否 OK, 如果不 OK,继续放在第二列、第三列、依次把所有列都 放完,找到一个合适 继续第三个皇后,还是第一列、第二列……直到.原创 2020-06-04 21:55:59 · 156 阅读 · 0 评论 -
递归之迷宫问题No.13
一、对迷宫问题分析如图所示:红色区域代表围栏不能通行,小球从左上角走到右下角为闯关成功 将图形转换为数字代替(用切片表示即可)如下图:1代表围栏;0代表通路;2代表走的路径 小球得到的路径,和程序员设置的找路策略有关即:可以先使用(下右上左),再改成(上右下左)二、代码实现package mainimport ( "fmt")//编写一个函数,完成老鼠找路//myMap *[8][7]int:地图,保证是同一个地图,使用引用//i,j 表示对地图的哪个点进行测.原创 2020-06-03 22:36:11 · 173 阅读 · 0 评论 -
数据结构之递归No.12
一、递归的概念简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时 可以让代码变得简洁。二、递归调用机制当程序执行一个方法就会开辟一个独立的栈空间,每个空间的变量都是独立的。 package mainimport "fmt"func main() { test(4)}func test(n int) { if n > 2 { test(n-1) } fmt.Println(n)原创 2020-05-31 14:07:44 · 205 阅读 · 0 评论 -
波兰表达式介绍No.11
一、波兰表达式介绍中缀表达式:a + b * (c - d) + e/f 前缀表达式:+a+*b-cd/ef 后缀表达式原创 2020-05-27 14:28:46 · 781 阅读 · 0 评论 -
栈的使用实例No.10
一、栈实现综合计算器(3+2*6-2)创建两个栈numStack和operStack numStack存放数,operStack存放符号 计算表达式是一个字符串,头开始位置是0 如果发现扫描的是一个数字直接入数栈。 如果发现是一个运算符如果operStack是一个空栈直接入栈如果operStack不是一个空栈...原创 2020-05-17 21:44:54 · 954 阅读 · 0 评论 -
数据结构之栈No.9
一、栈的介绍栈是一个先入后出(FILO-First In Last Out)的有序列表,可以抽象成一个存放子弹的盒子(先入后出来)。 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。 根据堆栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。 ...原创 2020-05-16 21:05:09 · 178 阅读 · 0 评论 -
环形单向链表的应用实例No.8
一、约瑟夫问题设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 用一个不带头结点的循环链表来处理 Josephu 问题:先构成一个有 n 个结点的单循环链表,然后 由 k 结点起从 1 开始计数,计到 m 时,对应结点从链表中删除,然后再从被删除结点的下一个结点又 从 1 开始计数,直到最后一个结点从链原创 2020-05-14 17:48:31 · 469 阅读 · 0 评论 -
数据结构之单向环形列表No.7
一、分析单向环形列表如何完成遍历,添加,修改和删除的思路环形列表的一个重要特质就是首尾相连,如果只有headNode节点则next指向自己。 添加:如果有新节点则当前节点的next指向新节点,新节点的next指向headNode节点 修改:找到编号和新节点编号相同的节点,将新节点的next指向上一个节点的next节点的next节点,然后上一个节点的next指向新节点。 删除:找到当前要删除的节点,将上一个节点的next指向当前节点的next节点。 展示:从头结点开始遍历,知道当前节点的next节原创 2020-05-09 15:42:07 · 321 阅读 · 0 评论 -
数据结构之双向链表No.6
一、分析双向链表如何完成遍历,添加,修改和删除的思路package mainimport ( "fmt")//定义一个 HeroNodetype HeroNode struct { no int name string nickname string pre *HeroNode //这个表示指向前一个结点 next *HeroNode //这个表示指...原创 2020-05-07 17:38:52 · 131 阅读 · 0 评论 -
数据结构之单链表No.5
一、链表的特点链表是一种非线性、非顺序的物理结构,是由若干个节点组成。 链表采用的是“见缝插针”的存储方法,不要求内存连续,靠next指针关联起来。 链表的物理存储方式为随机存储,访问方式为顺序访问。 链表适用于写操作多,读操作少的场景。二、链表数据结构图解它在内存中是存储如下,不要求内存连续,靠next指针关联起来 链表的物理存储方式为随机存储,访问方式为顺序访问...原创 2020-04-25 22:02:31 · 238 阅读 · 0 评论 -
线性结构和非线性结构No.1
一、线性结构线性结构最典型的数据关系就是一对一,它是一种有序数据的集合,什么叫有序呢?比如说一维数组,决定数组块中的数据元素只有一个因素,也就是从左往右或者从右往左的行因素,而不是像二维和多维数组受行和列及更多因素影响,这就是一对一的关系。线性结构,除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。常用的线性结构有:线性表,栈,队列,双队列,数组,串。特点:...原创 2020-04-19 14:34:39 · 435 阅读 · 0 评论 -
数组模拟环形队列No.4
一、是什么使用数组的形式模拟一个环形队列,先进先出,和redis的链表功能一样二、参数分析tail代表入队列key值 head代表出队列的key值 maxSize代表数组的最大容量三、分析思路什么时候表示队列满 (tail + 1) % maxSize = head tail == head 表示空 初始化时, tail = 0 head = 0 怎么统计该队列有多少个...原创 2019-11-22 10:33:51 · 204 阅读 · 0 评论 -
数组模拟队列No.3
一、队列介绍队列是一个有序列表,可以用数组或是链表来实现。 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出二、数组模拟队列当我们将数据存入队列时称为“addqueue”,addqueue的处理需要有两个步骤1、将尾指针往后移动:rear+1,front==rear (空)2、若尾指针rear小于等于队列的最大下标MaxSize-1,则将数据存入rear所指的...原创 2019-11-11 18:11:34 · 164 阅读 · 0 评论 -
稀疏数组No.2
一、实际的需求编写的五子棋程序中,有存盘退出和续上盘的功能二、基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。三、稀疏数组的处理方法记录数组一共有几行几列,有多少个不同的值 思想:把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模 四、应用实例使用稀疏数组,来保留类似五子棋二维数组 把稀疏...原创 2019-11-11 15:59:26 · 123 阅读 · 0 评论