算法与数据结构
zhangyingchengqi
学无止境。
展开
-
排序9-计数排序
计数排序是一种非基于比较的排序算法,我们之前介绍的各种排序算法几乎都是基于元素之间的比较来进行排序的,计数排序的时间复杂度为O(n+m),m指的是数据量,说的简单点,计数排序算法的时间复杂度约等于O(n),快于任何比较型的排序算法. 其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。1. 算法描述:找出待排序的数组中最大和最小的元素; 统计数组中每个值为i的元素出现的次数...原创 2020-11-25 15:40:19 · 247 阅读 · 0 评论 -
排序8-堆排序
利用堆这种数据结构来进行排序的算法,堆是一种优先队列,它有两种实现,最大堆和最小堆. 堆(以下全都默认为最大堆)看成一棵完全二叉树,但是位于堆顶的元素总是整棵树的最大值,每个子节点的值都比父节点小,由于堆要时刻保持这样的规则特性,所以一旦堆里面的数据发生变化,我们必须对堆重新进行一次构建。 既然堆顶元素永远都是整棵树中的最大值,那么我们将数据构建成堆后,第一次取的元素,就是最大值?取完后把堆重新构建一下,然后再取堆顶的元素,取的就是第二大的值, 反复的取,取出来的数...原创 2020-11-25 14:12:29 · 235 阅读 · 0 评论 -
排序7-快速排序
快速排序的核心思想也是分治法。它的实现方式是每次从序列中选出一个基准值,其他数依次和基准值做比较,比基准值大的放右边,比基准值小的放左边,然后再对左边和右边的两组数分别选出一个基准值,进行同样的比较移动,重复步骤,直到最后都变成单个元素,整个数组就成了有序的序列.1. 动图演示: 排序过程分解图: 以[8,2,5,0,7,4,6,1]为例首先,我们随机选择一个基准值4:与其他元素依次比较,大的放右边,小的放左边:再以同样的方式排左边的数据...原创 2020-11-25 11:18:33 · 546 阅读 · 0 评论 -
排序6-归并排序
归并排序是采用分治法(Divide and Conquer)的一个非常典型的应用。核心是将已有序的子序列合并,得到完全有序的序列;即分成两步: 1. 先使每个子序列有序, 2. 再将两个有序表合并成一个有序表, 这种操作称为2-路归并.1. 动图演示:步骤分解图:2.算法说明:把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排序好的子序列合并成一个最终的排序序列 从上面的步骤可以得知: ...原创 2020-11-25 10:26:50 · 429 阅读 · 0 评论 -
循环队列元素个数
1. 设有一个用数组Q[1..m]表示的环形队列,约定f为当前队头元素在数组中的位置,r为队尾元素的后一位置(按顺时针方向),若队列非空,则计算队列中元素个数的公式应为()A、 (m+r-f)mod mB、 r-fC、 (m-r-f)mod mD、 (m-r+f)mod m答案为: A分析:原创 2017-06-17 08:30:14 · 30627 阅读 · 2 评论 -
排序5-shell
在插入排序中,数组项只移到相邻位置。当项与正确的有序位置距离较远时,它必须进行很多次这样的移动。所以当数组完全无序时,插入算法效率不高,但当数组基本有序时,插入法有很好的效率. 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。它对具有等间距下标的项进行排序,不是移到相邻位置,而是移到多个位置之外。 它的基本思想是:先将整个待排序的记录序列分割成为若干子序...原创 2020-10-29 15:55:18 · 215 阅读 · 0 评论 -
排序4-插入
1. 动图演示2. 算法说明: 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 (有点像打扑克牌,抓牌的场景)从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; 将新元素插入到该位置后; 重复步骤2~5。3. java源码实现public static int[]...原创 2020-10-29 15:16:27 · 238 阅读 · 0 评论 -
排序3-选择
1. 动图演示2. 算法说明:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 重复第二步,直到所有元素均排序完毕。3. java源码实现 方案一:public static int[] selectSort(int[] sourceArray) { int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);...原创 2020-10-29 14:55:44 · 278 阅读 · 0 评论 -
排序2-冒泡
1. 动图演示2. 算法说明:比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~3,直到排序完成3. java实现:public int[] sort(int[] sourceArray) throws Exception { // 对 arr 进行拷贝,不改变参数内容 int[] arr .原创 2020-10-29 14:22:05 · 272 阅读 · 0 评论 -
排序1-基础
排序是常见且重要的任务,有很多排序算法问世,下面的大多数例子是对整数进行排序,但用java所实现的算法可以对任意的Comparable对象(即实现了接口Comparable的任意类的对象)进行排序. 常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。算法时间...原创 2020-10-29 11:03:12 · 375 阅读 · 0 评论