随笔分类 -  数据结构与算法 / 算法

算法
摘要:一、前言 经过60多年的发展,科学家和工程师们发明了很多排序算法,有基本的插入算法,也有相对高效的归并排序算法等,他们各有各的特点,比如归并排序性能稳定、堆排序空间消耗小等等。但是这些算法也有自己的局限性比如快速排序最坏情况和冒泡算法一样,归并排序需要消耗的空间最多,插入排序平均情况的时间复杂度太高 阅读全文
posted @ 2022-08-06 14:31 夏尔_717 阅读(385) 评论(0) 推荐(0) 编辑
摘要:归并排序是建立在归并操作上的一种有效的排序算法,1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。 一、基本思想 归并排序算法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序 阅读全文
posted @ 2022-07-04 20:28 夏尔_717 阅读(391) 评论(0) 推荐(0) 编辑
摘要:基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine),排序器每次只能看到一个列。它是基于元素值的每个位上的字符来排序的。对于数字而言就是分别基于个位,十位,百位或千位等等数字来排序。 基数排序(Radix sort)是一种非比较型整数排序算法,其原 阅读全文
posted @ 2022-07-04 20:27 夏尔_717 阅读(171) 评论(0) 推荐(0) 编辑
摘要:一、算法思想 桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点: 在额外空间充足的情况下,尽量增大桶的数量 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中 同时,对于桶中元素的排序,选择何种比较排序算法 阅读全文
posted @ 2022-07-04 18:08 夏尔_717 阅读(56) 评论(0) 推荐(0) 编辑
摘要:第一个突破O(n^2)的排序算法;是简单插入排序的改进版;它与插入排序的不同之处在于,它会优先比较距离较远的元素。 希尔排序(Shell Sort),也称递减增量排序算法,1959年Shell发明。是插入排序的一种高速而稳定的改进版本。 希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直 阅读全文
posted @ 2022-07-01 00:05 夏尔_717 阅读(240) 评论(0) 推荐(0) 编辑
摘要:1991年的计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd) 和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法(Heap Sort). 堆的定义如下:n个元素的序列k1,k2,···,kn当且仅当满足下关系时,称 阅读全文
posted @ 2022-07-01 00:05 夏尔_717 阅读(125) 评论(0) 推荐(0) 编辑
摘要:计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 一、基本思想 计数排序的特征当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比 阅读全文
posted @ 2022-07-01 00:05 夏尔_717 阅读(109) 评论(0) 推荐(0) 编辑
摘要:快速排序(Quicksort)是对冒泡排序的一种改进,由C.A.R.Hoare在1962年提出的一种划分交换排序,采用的是分治策略(一般与递归结合使用),以减少排序过程中的比较次数。 一、基本思想 快速排序的基本思想:挖坑填数 + 分治法。 首先选一个轴值(pivot,也有叫基准的),通过一趟排序将 阅读全文
posted @ 2022-06-24 11:55 夏尔_717 阅读(421) 评论(0) 推荐(0) 编辑
摘要:插入排序的设计初衷是往有序的数组中快速插入一个新的元素。它的算法思想是:把要排序的数组分为了两个部分,一部分是数组的全部元素(除去待插入的元素),另一部分是待插入的元素;先将第一部分排序完成,然后再插入这个元素。其中第一部分的排序也是通过再次拆分为两部分来进行的。 插入排序由于操作不尽相同,可分为直 阅读全文
posted @ 2022-06-20 18:58 夏尔_717 阅读(349) 评论(0) 推荐(0) 编辑
摘要:从算法逻辑上看,选择排序是一种简单直观的排序算法,在简单选择排序过程中,所需移动记录的次数比较少。 一、基本思想 选择排序的基本思想:比较 + 交换。 在未排序序列中找到最小(大)元素,存放到未排序序列的起始位置。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。 红色表示当前最 阅读全文
posted @ 2022-06-18 19:34 夏尔_717 阅读(146) 评论(0) 推荐(0) 编辑
摘要:我想对于它每个学过C语言的都会了解,这可能是很多人接触的第一个排序算法。 一、基本思想 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 阅读全文
posted @ 2022-06-11 15:30 夏尔_717 阅读(410) 评论(0) 推荐(2) 编辑
摘要:问题 假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法是讲,什么方法能最快的查出所有小字符串里的字母在大字符串里都有? 比如,如果是下面两个字符串: String 1: ABCDEFGHLMNOPQRS String 2: DCGSRQPO 答案 阅读全文
posted @ 2022-04-26 22:33 夏尔_717 阅读(58) 评论(0) 推荐(0) 编辑
摘要:基因遗传算法是一种灵感源于达尔文自然进化理论的启发式搜索算法。该算法反映了自然选择的过程,即最适者被选定繁殖,并产生下一代。本文简要地介绍了遗传算法的基本概念和实现,希望能为读者展示启发式搜索的魅力。 如上图(左)所示,遗传算法的个体由多条染色体组成,每条染色体由多个基因组成。上图(右)展示了染色体 阅读全文
posted @ 2022-04-26 21:48 夏尔_717 阅读(455) 评论(0) 推荐(0) 编辑
摘要:一、题目 编写两个任意位数的大数相乘的程序,给出计算结果。比如: 题目描述:输出两个不超过100位的大整数的乘积。 输入:输入两个大整数,如1234567和123 输出:输出乘积,如:151851741 或者 求1234567891011121314151617181920 * 2019181716 阅读全文
posted @ 2022-04-26 21:26 夏尔_717 阅读(1964) 评论(0) 推荐(0) 编辑
摘要:一、如何判断单链表是否存在环 有一个单向链表,链表当中有可能出现“环”,就像题图这样。如何用程序判断出这个链表是有环链表? 不允许修改链表结构。 时间复杂度O(n),空间复杂度O(1)。 1.1 方法一、穷举遍历 首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就从头节点重新遍历新 阅读全文
posted @ 2022-04-26 21:25 夏尔_717 阅读(400) 评论(0) 推荐(0) 编辑
摘要:一、基本原理和示例 在计算机程序中描述重复的一种方法是使用循环,如Java的while循环和for循环结构。实现重复的完全不同的方法是通过一个称为递归的过程。 递归是一种方法对自身进行一次或多次调用的技术,在执行期间,或数据结构依赖于同一类型的结构。有很多例子艺术与自然中的递归。例如,分形图案是自然 阅读全文
posted @ 2022-04-26 11:47 夏尔_717 阅读(1221) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示