
数据结构
文章平均质量分 73
chenkaixin_1024
这个作者很懒,什么都没留下…
展开
-
关于时间复杂度与空间复杂度
对于评价一个算法的好坏,我们通常以时间复杂度与空间复杂度来衡量。时间复杂度:算法中执行基本操作语句的总次数。空间复杂度:算法中创建对象的个数。原创 2017-04-19 16:16:52 · 549 阅读 · 0 评论 -
排序算法(四)---- 堆排序
利用最小堆/最大堆的性质,将数组中所有元素之间的关系构建成最大堆/最小堆,通过将堆顶元素(即arr[0])与末尾元素进行交换,此时尾部序列即为有序(最大堆为升序,最小堆为降序),然后对前面的元素(排除已进行过排序的末尾元素)重新构建最大堆/最小堆,因为堆顶元素与末尾元素进行了交换,很有可能造成最大堆/最小堆的性质遭到破坏,而由于只有堆顶元素发生了变化,所以这里可以采用从堆顶向下调整的方法,重新构建原创 2017-08-31 14:38:18 · 364 阅读 · 0 评论 -
排序算法(三)---- 选择排序
基本思想:在序列中找到最大(或最小)的值,将它放到序列区间的起始位置,随即缩小序列区间,进行重复操作,直到序列区间中没有数据注意选择排序与冒泡排序的区别:冒泡排序是交换两个相邻顺序与所求顺序相反的元素,从而将当前序列中的最大(最小)元素放到合适位置;而选择排序则是记录下当前序列中的最大(最小)元素,将其与合适位置的元素进行一次交换,使得最大(最小)元素放在合适位置选择排序的时间复杂度为O(原创 2017-08-31 14:36:28 · 271 阅读 · 0 评论 -
排序算法(二)---- 希尔排序
希尔排序又叫缩小增量排序,在直接插入排序的基础上,给定了一个增量gap,作为对给定序列的区间划分依据,如上gap=3,将原序列分为{5,4,1},{2,7,3},{9,6,8}三组数据,而对它们分别进行直接插入排序,在对每组完成直接插入排序之后,随即对增量进行缩小,直到gap=1时,此时在完成对应的直接插入排序之后,整个序列随即有序希尔排序的时间复杂度大致为O(N^1.25)~O(1.6N^1原创 2017-08-31 14:34:42 · 324 阅读 · 0 评论 -
排序算法(一)---- 直接插入排序
基本思想:取序列中的第i个元素,(在取到第i个元素之前,第i个元素前面的序列已经经过排序,成为有序序列,第i个元素及其之后的序列即为无序序列),将第i个元素与之前的有序序列中的元素依次进行比较,并将其插入到合适的位置,由此对原序列中的每一个元素进行上述操作,即可得到有序序列因为在获取待插入元素的时候要对数组进行一次遍历,而每遍历到一个元素又要将其与之前的有序序列中的元素进行比较,又要进行一次遍原创 2017-08-31 14:27:28 · 317 阅读 · 0 评论 -
排序算法(七)---- 非比较排序
一.计数排序顾名思义,通过记录原序列中的每个数据出现的次数,然后将其保存在辅助空间的对应位置(位置=当前数据-最小数据),通过分析辅助空间和原序列,可以将原序列变成有序序列算法如下:void CountSort(int arr[],int size){ int i=0; int max=arr[0]; int min=arr[0];原创 2017-09-04 22:36:51 · 570 阅读 · 0 评论 -
排序算法(六)---- 归并排序
对于归并排序,与快速排序一样,巧妙的应用了分治算法的核心思想,它将整个序列分成若干组子序列,对这些子序列进行排序后,在一步一步进行合并有序子序列,从而使得整个序列达到有序。但针对于归并排序,有着两种不同的排序方式,一是通过整个序列进行着手,将这个序列进行一步一步的划分,自顶向下进行处理,主要步骤包括序列划分,子序列排序,以及合并,而这一方法可以通过递归来实现;与之相对的就是另外一种方式,自底向原创 2017-09-04 22:31:35 · 473 阅读 · 0 评论 -
迷宫算法
迷宫算法的核心思想是对自己当前的位置的前后左右进行判断,判断是否为通路,如果是通路就可以朝对应的方向走,而走到下一步也是进行相同的判断,但对于前后左右均不通的话,那就得往回走(这里我们将走过的路进行标记,防止在判断的时候与未走过的混淆影响判断)对于迷宫地图,我们可以给出一个二维数组,当中的每一个元素代表二维数组中的每一个位置,1----通路,0---障碍物,2----已走过的路,3----已走过并判断出是死路的路径原创 2017-04-27 11:31:39 · 2675 阅读 · 0 评论 -
二叉搜索树的实现(查找,插入,删除的递归与非递归)
BST定义:二叉搜索树:又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树1、若它的左子树不为空,则左子树上所有节点的值都小于根节点的值2、若它的右子树不为空,则右子树上所有节点的值都大于根节点的值3、它的左右子树也分别为二叉搜索树原创 2017-05-16 23:16:46 · 583 阅读 · 0 评论 -
AVL树的旋转操作
首先,在讨论AVL树之前,我们得明白一点,那就是为什么得有AVL树?AVL树与二叉搜索树一样都是用于搜索的二叉树,也可以这么说AVL树是特殊的二叉搜索树,它与二叉搜索树的主要区别在于AVL树中给定了平衡因子(左右子树的高度差),而且明确规定,平衡因子最大不能超过1,最小不能小于-1,因此我们的AVL树中左右子树的高度差只能为0,1,-1,也就是说不会出现一段较长的单支的情况,而对于二叉搜索树而言,单支树的情况完全可能出现。而对于单支树这种情况,我们对于其的搜索就相当于对一个单链表进行搜索,时间复杂度由原原创 2017-05-23 22:35:06 · 310 阅读 · 0 评论 -
递归与尾递归
对于递归,我们都不陌生,简单的来说就是一个函数直接或间接的调用自己,一般来说,我们在使用递归算法的时候都是有条件的:1.首先问题的规模是在不断缩小的,我们可以通过解决子问题从而来解决我们的原问题,而且子问题和原问题的解决方法都是一样的;2.我们使用递归算法,在问题不断演化的过程中,必须有一种情况我们是能够解决,也就是必须得有我们的递归出口原创 2017-04-20 14:23:23 · 397 阅读 · 0 评论 -
排序算法(五)---- 快速排序
对于快速排序,与冒泡排序一样属于交换排序,但是快速排序是在冒泡排序的基础之上的优化,由于冒泡排序需要进行多次的交换,从而导致冒泡排序的效率相对较低,而快速排序应用了分治这一算法思想,通过设定基准值,用序列中的数据与这一基准值进行比较,从而达到将所有大于基准值的数据放到基准值一边,所有小于基准值的数据放到基准值另一边这一目的。从而将原序列以基准值为界,分成大于基准值与小于基准值这两部分,然后对于这分割后的两部分,分别进行之前的操作原创 2017-09-01 10:06:33 · 407 阅读 · 0 评论