摘要: ``` //UNION(x,y)是将x,y分属的集合合并成一个集合,集合名字为两个集合名称的其中一个(按秩合并) //FIND(x)是寻找x所属的集合名称(路径压缩) //其中的关键是要快速找到根节点(集合名称) //使用条件:不需要考虑集合内部情况,只要快速知道集合名称(根节点),并以此判断 // 阅读全文
posted @ 2016-08-24 09:11 jiangge3 阅读(99) 评论(0) 推荐(0)
摘要: ``` //堆辅助运算Siftup //堆的定义是可看做是几乎完美的二叉树,父节点的键值不小于子节点. //如果某个节点i 1,有H[i/2]父节点比子节点H[i]小,则该节点需要向上移动,知道满足堆的性质(父节点的键值不小于子节点),因此有算法Siftup //用数组表示堆,数组的下标表示节点的位 阅读全文
posted @ 2016-08-23 16:14 jiangge3 阅读(399) 评论(0) 推荐(0)
摘要: ``` //Siftdown是在2i或2i+1n,k表示至多需要比较的次数 //子节点存在有2种情况,一是存在左节点,二是存在左和右节点,需要进行判断,一般来说除最后一层,都是有左右节点 //一是左节点的情况下,只要比较,如果小于左节点,则交换,否则停止 //二是左右节点的情况下,又分为3种情况,1 阅读全文
posted @ 2016-08-22 09:09 jiangge3 阅读(1046) 评论(0) 推荐(0)
摘要: ``` include using namespace std; //实现将元素x插入现有堆a[] //将元素x暂时放在a[length]位置,然后调用siftup,完成排序.关键问题在于数组a大小的变化是否需要重新建立数组b,还是用其他方法. //从现有堆a[]删除第i个元素 //相当于将第i个元 阅读全文
posted @ 2016-08-20 14:39 jiangge3 阅读(440) 评论(0) 推荐(0)
摘要: ``` include include // include using namespace std; //要求:合并两个有序的元素(一般升序),结果也是升序 //输入:两组有序的元素 //输出:一组有序的元素 //想法 //新建数组: //先申请一个空间大小为a.length+b.length的数 阅读全文
posted @ 2016-08-17 08:36 jiangge3 阅读(142) 评论(0) 推荐(0)
摘要: ``` //实现将无序的数组构建成堆的结构:(因为堆的结构是近乎二叉树,节点编号是从上到下,从左到右 //可以用数组下标表示) //想法是建立空数组(不用,完全可以在原数组上操作),每次取出一个数字,放入当前尾部, //与父节点比较(考虑存在问题)(根本不用考虑父节点问题,因为插入堆之前默认堆是有序 阅读全文
posted @ 2016-08-16 08:48 jiangge3 阅读(1082) 评论(0) 推荐(0)
摘要: ``` #include #include using namespace std; //查找 /*实现二分搜索 输入一组有序的数组和一个需要查找的数值 输出该数值的位置,若没有,则返回-1*/ //由于C++数组没有直接获得数组长度的函数,因此使用sizeof(array)/sizeof(array[0]),可以用模板定义 template int GetArrayLen(T& arr... 阅读全文
posted @ 2016-08-15 20:00 jiangge3 阅读(128) 评论(0) 推荐(0)