• 数据结构与算法——希尔排序

    希尔排序是是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本,通过把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 算法要点 将一个序列中的数据按一定的步长step划分为n组,对每个组中的数据进行插入排序(值得注意的是,每个组进行插入排序时,不需要遍历每一...
  • 数据结构与算法——插入排序

    也称为直接插入排序、简单插入排序等。插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间 算法要点 将一个序列中的数据分成两个部分,从前到后依次为有序序列和无序序列 遍历拿...
  • 数据结构与算法——选择排序

    首先在未排序序列中找到最小/大元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小/大元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 算法要点 假设第一个元素为最小/大的元素,然后于后续的元素依次比较,遇到比这个更小/大的元素则记录键与值,等到全部比较完成后,就拿到了未排序序列中的最大/小元素,然后与...
  • 数据结构与算法——冒泡排序

    它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)逆序就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端 算法要点 依次比较相邻的两个元素,如果逆序,则交换。通过这种方式,在第一轮完成后,就可以确定最后一个元素的位置 上述工作重复进...
  • 数据结构与算法——回溯算法

    回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 在代码中,我们通常使用递归函数来实现回溯算法,所以可以通过递归函数来了解回溯算法的机制。下面通过经典案例《八皇后问题》来学习了解这一算法。 八皇后问题 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一...
  • 数据结构与算法——逆波兰算法

    逆波兰算法是什么?逆波兰算法是通过将“中缀表达式”转化“后缀表达式”(也称为“逆波兰表达式”)的方式,实现一个公式的自动计算。 各类表达式 中缀表达式 前缀表达式 后缀表达式 中缀表达式是一个通用的算术或逻辑公式表示方法。在日常生活中,我们所识所见的表达式通常都是中缀表达式。中缀表达式的操作符是以中缀形式处于操作数的中间(例如:3 + 4),而前缀表达式则是需要将操作符前置(例如:+...
  • 数据结构与算法——栈

    通过对队列的了解,我们知道队列是一种受限的线性表,数据出入的限制为“先进先出”。与队列对应的则是栈,栈也是一种受限的线性表,数据出入的限制为“先进后出”,与队列相同,我们可以称栈为“先进后出线性表”。 为什么栈要遵循“先进后出”的规则呢,因为栈的数据结构就像一个木桶一样,先入栈的数据在木桶底部,后入栈的数据在木桶顶部,在出栈的时候,后入栈的数据将优先被取出,所以造成了“先进后出”的现象。...
  • 数据结构与算法——链表

    数据结构从存储结构上分为顺序存储结构和链式存储结构,顺序存储结构的典型代表就是JAVA/C/C++等语言中的数组,而链式存储结构典型代表就是链表。链表属于链式存储结构,同时也属于线性结构(想了解结果分类的朋友可以查看上一篇博客)。 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称...
  • 数据结构与算法——队列

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 队列的特点 遵循先进先出的原则,与栈相反,栈遵循先进后出的原则 队列中通常存在两个指针front和rear,分别称为队头、队尾。数据通常是从队尾入队(插入操作),从队头出队(删...
  • 数据结构与算法——稀疏数组

    通过将稀疏矩阵类型的二维数组通过技术手段生成的可以节省内存的数据结构,称为稀疏数组。稀疏数组归根结底还是一个数组,只不过对重复值较多的二维数组进行整理,达到降低存储空间的要求。当然,目标数组需要有一定的要求,下面通过实用的例子说明: 在五子棋游戏中,需要对每一个步骤的棋盘进行存储,定义棋盘为8×8的棋盘,0代表无子,1代表黑子,2代表白子。初始化棋盘后,如果使用原始数组保存棋盘数据,至少...
123457