Algorithms
文章平均质量分 58
小咸鱼_
这个作者很懒,什么都没留下…
展开
-
学习算法导论——堆排序
《算法导论》第三版书中数组下标是从1开始的,但是这里从0开始。1.堆定义堆分为两种,即最大堆和最小堆,最大堆的定义为:当数组A大小为n时(A中有n个元素),若2*i+1=A[2*i+1];若2*i+2=A[2*i+2],则这样的数据结构称为最大堆。说白了就是根节点(包括子树的根节点)的值不小于左节点和右节点的值(如果有左或右节点的话)。最小堆和最大堆刚好相反。2.创原创 2016-03-01 11:31:11 · 751 阅读 · 0 评论 -
分治法求解最大子数组问题
最大字数组问题即对某一数组A,其元素有正有负,找到一个子数组,其元素是连续的且其和最大。如图数组A:其最大字数组为A[7..10],即A[7]+A[8]+...+A[10]=43是数组A连续元素中最大值。我们用分治法求解:假设我们要寻找数组A[low...high]的最大子数组,使用分治法意味着我们要将数组划分成两个规模尽量相等的子数组。也就是说找到数组的中间位置mid,然原创 2016-02-29 15:24:56 · 2295 阅读 · 0 评论 -
修改归并排序求数组逆序对
假设A[1...n]是一个有n个不同数的数组。若iA[j],则(A[i],A[j])称为一对逆序对。例如数组的逆序对有(2,1) (3,1) (8,1) (6,1) (8,6)。如可以通过修改归并排序来求逆序对数量。int merge_sort(int A[], int p, int r) { if (p < r) { int inversions = 0;原创 2016-02-29 09:45:15 · 759 阅读 · 0 评论 -
学习算法导论——冒泡排序
冒泡排序是一种流行但低效的排序算法,它的作用是反复交换相邻的未按次序排序的元素。伪代码:Bubble_Sort(A) for i=1 to A.length-1 for j=A.length downto i+1 if A[j]<A[j-1] exchange A[j] with A[j-1]C++代码:void Bubble_Sort(){ int原创 2016-02-29 08:58:43 · 891 阅读 · 0 评论 -
学习算法导论——选择排序
考虑排序存储在数组A中的n个数:首先找出A中的最小元素并将其与A[0]中的元素交换。接着,找出A中次小的元素并将其与A[1]中的元素交换。该算法称为选择排序。伪代码:SELECTION-SORT(A): for i = 1 to A.length - 1 min = i for j = i + 1 to A.length if A[j] <原创 2016-02-28 19:39:36 · 1056 阅读 · 0 评论 -
两个n位二进制整数相加的问题
考虑把两个n位二进制整数加起来,这两个整数分别存储在两个n元数组A和B中,这两个整数的和应按二进制形式存储在一个n+1元数组中。伪代码:ADD-BINARY(A, B): C = new integer[A.length + 1] carry = 0 for i = 1 to A.length C[i] = (A[i] + B[i] + carry) % 2 /原创 2016-02-28 16:22:02 · 4289 阅读 · 3 评论 -
学习算法导论——插入排序
插入排序和排序一手扑克牌相似,假设桌面上有一些牌,我们用右手拿起一张,从右到左与左手的牌对比,插入正确位置,如图。左手中的牌总是排好序的,如果是第一张牌,直接放到左手即可。C++代码:void Insertion_Sort(int A[],int len){ int key; int i; for (int j = 1; j < len; ++j) { key = A原创 2016-02-28 14:09:09 · 1015 阅读 · 0 评论 -
学习算法导论——红黑树旋转插入和删除
红黑树是一棵二叉搜索树,每个节点有一个标志位表示颜色,该颜色可以是红(RED)或黑(BLACK)。通过对任何一条从根到叶子的简单路径上各点的颜色进行约束,就能确保没有一条路径会比其他路径长出2倍,因而是近似于平衡的。红黑树每个节点有5个属性,color,key,leftChild,rightChild,p。其中color是颜色,key是关键字,leftChild是指向左孩子的指针,rightC原创 2016-03-15 21:22:21 · 5981 阅读 · 2 评论 -
学习算法导论——快速排序
快速排序用的也是分治法,快速排序分为三个步骤:1.分解数组A[low..high]被划分为两个(可能为空)的子数组A[low...q-1]和A[q+1...high],使得A[low...q-1]中的每个元素都小于等于A[q],而A[q]小于等于A[q+1...high]中的每个元素。q是一个划分点。2.解决通过递归调用快速排序,对字数组A[low...q-1]和A[q+1..原创 2016-03-02 08:56:39 · 696 阅读 · 0 评论 -
给定一个集合,输出它的所有子集
题目:集合是由大字字母(A-Z)组成的,要求输出集合的所有子集,每个子集一行,不能使用递归。例如 “ABD”的子集:NULL(空集)、A、B、C、AB、AC、BC、ABC(共8个)这个题可以用位图的思想做。比如集合{A,B} 对应位向量v=000...00011(26维)那么A表示1,B表示2,[0,3]循环(3是B在字母表的位置2+1计算得):0 & v原创 2017-06-05 14:51:01 · 5439 阅读 · 1 评论