算法
文章平均质量分 85
LucienDuan
这个作者很懒,什么都没留下…
展开
-
算法导论 第9章 中位数和顺序统计学(线性时间选择算法)
/* * 算法导论 第九章 中位数和顺序统计学 * 线性时间选择元素 */#include #include using namespace std;int minimum(int *arr, int len);int randomizedSelect(int *arr, int p, int r, int i);int randomizedPartition(int *ar原创 2014-08-18 18:18:28 · 2866 阅读 · 0 评论 -
算法导论 第12章 二叉查找树
二叉查找树是一种树数据结构,它与普通的二叉树最大的不同就是二叉查找树满足一个性质:对于树中的任意一个节点,均有其左子树中的所有节点的关键字值都不大于该节点的关键字值,其右子树中的任意一个节点的关键字值都不小于该节点的关键字值。在二叉查找树上可以进行搜索、取最小值、取最大值、取指定节点的前驱、取指定节点的后继以及插入和删除节点操作,因此二叉查找树和堆(大顶堆和小顶堆)一样,也可以做优先队列,都能够在 O(lgn) 的时间内取得集合的最大值和最小值。一个二叉查找树的期望高度为O(lgn),因此在二叉查找树上的基原创 2014-08-27 00:52:59 · 2061 阅读 · 0 评论 -
算法导论 第11章 散列表
散列表是主要支持动态集合的插入、搜索和删除等操作,其查找元素的时间在最坏情况下是O(n),但是在是实际情况中,散列表查找的期望是时间是O(1),散列表是普通数组的推广,因为可以通过元素的关键字在数组对元素进行直接定位,所以能够在O(1)时间内访问数组的任意元素。原创 2014-08-26 12:03:05 · 1573 阅读 · 0 评论 -
排序算法小结
经典的排序算法有十种,分别是:选择排序、插入排序、希尔排序、冒泡排序、堆排序、合并排序、快速排序、计数排序、基数排序和桶排序。下面对这些算法分类如下:选择排序:简单选择排序、堆排序插入排序:直接插入排序、二分插入排序、希尔排序快速排序:快速排序、随机化快速排序线性时间排序:计数排序、基数排序、桶排序其他:冒泡排序、合并排序这些排序排序算法的时间复杂度,稳原创 2014-08-20 14:40:40 · 1006 阅读 · 0 评论 -
算法导论 习题12.1-3 二叉树的无栈非递归中序遍历算法
二叉树的中序遍历的无栈非递归算法中,需要解决的两个问题是:1、判断子树是否已经遍历2、从子节点回溯到父节点要解决这两个问题可以在树的结点中增加两个数据:parent和isVisited,这样可以解决,但如果不添加新的数据结构,又如何解决呢?可以在遍历树的结点之前将每个结点与其下一个遍历结点相关联起来,这种关联关系既可以用来回溯到父节点,也可以用来判断子树是否已经遍历。直原创 2013-11-25 16:02:10 · 1745 阅读 · 0 评论 -
算法导论 第7章 快速排序
快速排序在最坏情况下的时间复杂度为O(n^2),虽然在最坏情况下运行时间比较差,但是快速排序通常是用于排序的最佳选择,因为其平均性能相当好,期望的运行时间为O(nlgn),且在O(nlgn)的记号中隐含的常数因子很小。快速排序和合并排序有相似之处,都是需要划分序列,在合并排序中,划分的过程很简单,直接选择元素序列的中间位划分位置,排序是在合并的过程中实现的,所以合并排序的合并过程很重要;相比合原创 2014-08-10 14:13:32 · 1576 阅读 · 0 评论 -
算法导论 习题15.4-5 15.4-6 找出一个n个数的序列中最长的单调递增子序列
算法导论15.4-5 请给出一个O(n^2)时间的算法,使之能找出一个n个数的序列中最长的单调递增子序列。这个题目是在动态规划部分,此处显然是要用到动态规划。我们知道可以使用动态规划思想的问题的的两个重要的特征是具有最优子结构和重叠子问题。原创 2014-04-24 12:48:54 · 10573 阅读 · 8 评论 -
算法导论 第8章 线性时间排序(计数排序、基数排序、桶排序)
/* * 算法导论 第八章 线性时间排序 * 计数排序、基数排序和桶排序 */#include #include #include #include using namespace std;void printArray(int arr[], int len, char *str){ cout << str << endl; for (int i=0; i<len; i原创 2014-08-11 22:14:10 · 1422 阅读 · 0 评论 -
算法导论 第6章 堆排序(简单选择排序、堆排序)
堆数据结构实际上是一种数组对象,是以数组的形式存储的,但是它可以被视为一颗完全二叉树,因此又叫二叉堆。堆分为以下两种类型:大顶堆:父结点的值不小于其子结点的值,堆顶元素最大小顶堆:父结点的值不大于其子结点的值,堆顶元素最小堆排序的时间复杂度跟合并排序一样,都是O(nlgn),但是合并排序不是原地排序(原地排序:在排序过程中,只有常数个元素是保存在数组以外的空间),合并排序的多有元素都被原创 2014-08-05 22:03:46 · 1304 阅读 · 0 评论 -
算法导论 第2章 算法入门(直接插入排序、希尔排序、冒泡排序、合并排序)
本章主要是算法知识的基础讲解,介绍了循环不变式,几个简单的排序算法,递归分治算法等内容。1、循环不变式循环不变式主要用来说明算法的正确性,那么什么是循环不变式呢,其实就是在循环过程中,一些元素数据必须保持的一些性质,例如在插入排序中,数组为A,必须保证三个性质:(1) 初始化:在循环开始之前,循环不变式是成立的,即:A[0]是有序的,A[1...n-1]是无序的。(2) 保持:在循原创 2014-08-05 15:07:31 · 1412 阅读 · 0 评论 -
算法导论 第13章 红黑树(图文详细解说)
二叉查找树的基本操作包括搜索、插入、删除、取最大和最小值等都能够在O(h)时间复杂度内实现,因此能在期望时间O(lgn)下实现,但是二叉查找树的平衡性在这些操作中并没有得到维护,因此其高度可能会变得很高,当其高度较高时,而二叉查找树的性能就未必比链表好了,所以二叉查找树的集合操作是期望时间O(lgn),最坏情况下为O(n)。红黑树也是一种二叉查找树,它拥有二叉查找树的性质,同时红黑树还原创 2014-08-27 23:36:18 · 2811 阅读 · 1 评论