算法
千霜
未来的码农
展开
-
算法与复杂度
1 算法定义算法定义为一个用于实现某个特定任务的有穷指令集,这些指令规定了一个运算序列。算法特性输入性:一个算法必须具有零个或多个输入量 输出型:一个算法应有一个或多个输出量,输出量是算法计算的结果 确定性:算法中每一条指令应含义明确、无歧义,即对每一种情况、需要执行的动作都应严格地、清晰地规定 有穷性:算法的指令执行序列是有穷的 有效性:每条指令必须是足够基本的。也就是说,他...原创 2018-08-27 11:29:32 · 1030 阅读 · 0 评论 -
平衡二叉树
二叉排序树的查询性能和二叉树的结构有关,如果二叉排序树退化为单链表,那么查询时间就是O(n),而平衡二叉树使得左右子树高度差不超过1,因此查询效率高,为O(log2n)。性质:左子树和右子树都是平衡二叉树,且左右子树高度差的绝对值不超过1。平衡因子:右子树减去左子树的高度差。当平衡因子大于1时,则失去平衡,需要调整失去该平衡的最小子树。在插入的过程中会碰到四种插入情况,需要不同的调整方...原创 2018-09-02 20:58:31 · 225 阅读 · 0 评论 -
排序小结
所谓排序,就是对数据元素集合建立某种有序排序的过程。也就是对它的关键字进行排序。所谓稳定性,就是关键字相同的两个数据元素在排序结束后不会改变两者之间的相对位置。一般不稳定算法效率较高。内部排序和外排序:内排序就是说数据元素能够全部放入内存中排序,而外排序是指因为数据元素太多了,数据元素不能全部放入内存中,需要不断的在内存和外存之间交换数据元素的排序。按照时间复杂度可将排序分为三种:简单...原创 2018-08-30 12:33:51 · 183 阅读 · 1 评论 -
基数排序
多关键字排序数据元素的关键字有多个,比如。其中,为最高位关键字,为最低位关键字。两种常用的排序方法:最高位优先法MSD:这是一个递归过程,即先根据最高位关键字进行排序,按值的不同,将整个排序表分成若干个子表。然后分别对每个子表的数据元素根据关键字用最高位优先法进行排序。如此递归,直到对完成排序为止。最低位优先法LSD:首先根据最低位关键字对排序表中所有数据元素进行一趟排序,...原创 2018-08-30 10:57:03 · 363 阅读 · 0 评论 -
二叉排序树
二叉排序树的性质:左子树(如果存在)上所有节点的关键字都小于根节点的关键字。 右子树(如果存在)上所有节点的关键字都大于根节点的关键字。 左子树和右子树也是二叉排序树。代码。。public class App { public static void main(String[] arg) { int[]array= {39,11,68,46,75,23,71,8,86,3...原创 2018-09-01 23:02:27 · 229 阅读 · 0 评论 -
归并排序
归并将两个有序表合并成一个有序表两路归并排序假设初始排序表有n个数据元素,首先把它看成是长度为1的首尾相接的n个有序子表(归并项),先做两两归并,得到ceil(n/2)个长度为2的归并项(如果n为奇数,则最后一个归并项的长度为1);再做两两归并,.......,如此重复,最后得到一个长度为n的有序列表。代码:public class App { public stat...原创 2018-08-29 09:53:08 · 139 阅读 · 0 评论 -
堆排序
堆排序的基本思想是:对排序表中的数据元素,利用堆的调整算法形成堆。 输出堆顶元素。 对剩余元素重新调整形成堆。 重复执行步骤(2)和(3),直到所有数据元素被输出。本代码中建立了最大堆,然后将堆顶元素与数组中最后的元素交换位置。再将前n-1个数据元素重新形成最大堆,重复上述步骤,直到输出所有堆元素。代码如下:public class App { public stat...原创 2018-08-28 21:36:46 · 149 阅读 · 0 评论 -
顺序表查找
顺序查找就是从一端开始比较,直到找到或者全部计较完。平均查找长度(n+1)/2折半查找首先必须是有序表,然后每次和表中中间的元素比较,如果相等则找到,不相等就排除一半的数据元素。有两种实现,迭代和递归平均查找长度为O()。对于有序表还有斐波拉契查找和插值查找。下面给出顺序查找和折半查找的迭代、递归查找算法。public class App { int[] ...原创 2018-08-31 16:37:08 · 8416 阅读 · 1 评论 -
二叉树应用-堆
本例中实现了最小堆的构造、插入、删除。最小堆表示一个非终端节点均不大于其左右孩子节点。最小堆用完全二叉树表示,但是二叉树存入一维数组中。将完全二叉树存入数组,有一些性质。先将二叉树从上到下,从左到右给每个节点编号0,1....n。那个一个节点编号i,他的左孩子编号为2*i+1,右孩子编号2*i+2。完全二叉树的最后一个分支节点(非终端节点)为(n-2)/2。堆的构造:找到最后的分支节点,使...原创 2018-08-28 20:31:39 · 467 阅读 · 0 评论 -
直接选择排序
选择排序的基本思想是:第一趟在有n个数据元素的排序表中选出关键字最小的数据元素,然后在剩下n-1个数据元素中再选取关键字最小(整个数据表中次小)的数据元素,依次重复,每一趟总是在当前剩下的待排序数据元素中选出关键字最小的数据元素。选择排序有三种经典的排序方法,而接下来介绍的直接选择排序是最简单的一种。public class App { public static void ma...原创 2018-08-28 13:58:58 · 237 阅读 · 0 评论 -
希尔排序
希尔排序又称为缩小增量排序,它的基本思想是:设排序表中有n个数据元素,首先取一个整数d<n作为间隔,将全部数据元素分为d个子表,所有相距为d的数据元素放在同一个子表中,在每个子表中分别进行直接插入排序,然后缩小间隔d(例如取d=ceil(d/2),ceil为向上取整),重复上述的子表划分和排序工作。如此循环,直到最后d=1,将所有数据元素放在同一个序列中进行直接插入排序。看一个例子,排序...原创 2018-08-28 13:35:55 · 343 阅读 · 0 评论 -
折半插入排序
折半插入排序的思想是:设排序表有n个数据元素,其中前i个已经排好序了,在插入第i+1个时,利用折半查找方法寻找插入位置。折半查找只能在顺序表中实现。代码:public class App { public static void main(String[] arg) { int[] array= {46,31,6,19,23,31}; binaryInsertSort(a...原创 2018-08-28 09:46:59 · 343 阅读 · 0 评论 -
直接插入排序
插入排序的基本思想是:每次设法把一个数据元素插入到已经排序的部分序列的合适位置,使得插入后的序列仍然是有序的。依据寻找插入位置方法的不同,有多种不同的插入排序方法。直接插入排序基本思想:开始时把第一个数据元素作为初始的有序序列,然后从第二个数据元素开始一次把数据元素按关键字大小插入到已排序的部分排序表的适当位置。当插入第i个数据元素时,前面的i-1个数据元素已经排好序了,这时,用第i个数据...原创 2018-08-27 22:34:19 · 331 阅读 · 0 评论 -
快速排序
快速排序又叫做分区交换排序,这是一种平均性能非常好的排序方法,属于交换排序的一种。其基本思想是:任取排序表中的某个数据元素(例如取第一个数据元素)作为基准,按照该数据元素的关键字大小,将整个排序表划分为左右两个子表:左侧子表中所有数据元素的关键字都小于或等于基准数据元素的关键字,右侧子表中所有数据元素的关键字都大于基准数据元素的关键字,基准数据元素则排在这两个子表中间(这也是该数据元素最终应安...原创 2018-08-27 21:37:44 · 200 阅读 · 0 评论 -
冒泡排序
交换排序的基本思想是对排序表中的数据元素按关键字进行两两比较,如果发生逆序,则两者交换位置,直到所有数据元素都排好序为止。而冒泡排序属于交换排序的一种。冒泡排序的算法思想是:设排序表中有n个数据元素,对第一个和第二个数据元素的关键字比较,如果第一个大,则交换。然后对第二个和第三个做同样处理。重复直到处理完最后两个元素。此为一趟冒泡,导致关键字最大的数据元素被移动到最后一个位置。 然后进行...原创 2018-08-27 20:05:29 · 156 阅读 · 0 评论 -
散列表查找
所谓查找就是通过关键字key找到数据元素的地址。本质上是确定关键字集合K到地址空间A的映射:H:K-->A。所有的算法都是在计算H(k)的值的过程。大多数查找算法没有一个简单直接的对应关系。而散列函数就是一个映射关键字到散列表的压缩函数。通过一个简单的映射关系,直接通过key计算出地址。数据元素存放的地方称为散列表。对于给定的关键字集合,散列函数(hash)计算的地址要分布均匀,这样...原创 2018-09-03 10:43:03 · 936 阅读 · 0 评论