
算法导论
文章平均质量分 74
臻舍
这个作者很懒,什么都没留下…
展开
-
快排的优化
转自http://bbs.chinaunix.net/thread-1073067-1-1.html看快排的时候对其性能也有所质疑,看到这篇文章不错,所以转来分享。快速排序算法是一种基于分治技术的重要的排序算法,自从它被发明以来,就受到了研究人员的广泛注意。多年以来,人们对这个基本算法进行了大量的改良。我搜集并查阅了一些相关的资料,在下文中对这些改进做出一些介绍。一、基本的转载 2015-05-15 14:34:12 · 686 阅读 · 0 评论 -
LeetCode----树
1.题目:Invert Binary Tree/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), righ原创 2015-06-16 09:35:06 · 451 阅读 · 0 评论 -
常用排序算法总结
1.插入排序1)直接插入排序(稳定)代码:void DirectInsertSort(int* arr, int len){ if(NULL==arr || len<=1) return; int keyIndex;//要插入的值下标 for(keyIndex=1;keyIndex<len;++keyIndex) { int key=arr[keyIndex]原创 2015-07-02 15:21:05 · 401 阅读 · 0 评论 -
算法导论 改进快排(1)----几乎有序的序列 7.4-5
问题:当输入数据已经“几乎有序”时,插入排序性能比快速排列好。为了提高快排苏旭,当对一个长度小于k的字数组调用快排时,让它不做任何排序就返回。当上层的快速排序调用返回时,对整个数组运行插入排序来完成排序过程。证明这一排序算法的期望时间复杂度为O(nk+nlg(n/k))证明:严格的证明 http://m.blog.youkuaiyun.com/blog/leolinsheng/8915864, 我看了觉得原创 2015-05-15 14:50:15 · 2651 阅读 · 0 评论 -
算法导论 最坏情况为线性时间的选择算法 9.3-8 9.3-9
1.最坏情况为线性时间的选择算法代码:#include#includeusing namespace std;//1.把n个元素按每组k个元素划分为upfloor(n/k)组(k>3),最后一组元素个数可能小于k个//2.利用插入排序InsertSort找到每组中的中位数//3.递归调用Select从步骤2中找到的中位数组中找出其中位数int Select(int * A原创 2015-05-25 20:27:31 · 1832 阅读 · 0 评论 -
Leetcode---线性数据结构(栈,链表,队列)的
1.题目:单链表的逆转(循环和递归)思路:循环:用两个指针p1,p2,p1指向node,p2指向node->next;在将p2->next指向p1前,先将p2->next保存下来。然后将p1,p2依次往后挪动递归:将链表拆分为表头节点和余下链表,将余下链表逆序后,再表头节点链接到逆序后的余下链表中注:对于线性数据结构,比较适合用迭代循环方法,而对于树状数据结构,比如二叉树,递归方法原创 2015-06-17 18:56:19 · 492 阅读 · 0 评论 -
算法导论8-4
问题:n个红色水壶和n个蓝色水壶,相同颜色水壶可盛的水都不一样多,但每一个红色水壶都有一个对应的蓝色水壶,二者可盛的水一样多。不同颜色的水壶可以互相比较判断可盛的水是否一样多。但是相同颜色的水壶不能相互比较。设计一个随机算法,其期望的比较次数为O(nlgn).思路:红色水壶和蓝色水壶比较,可在找到与其容量一样多的蓝色水壶的同时将剩下的蓝色水壶分为两组:容量比它大的和容量比它小的;原创 2015-05-22 20:09:09 · 857 阅读 · 0 评论 -
算法导论 10.4-3 输出二叉树的每个结点的关键字
问题:给定一个n个结点的二叉树,写出一个O(n)时间的非递归过程,将该树的每个结点的关键字输出。可以使用一个栈作为辅助数据结构。思路:利用栈依次将各个结点压入栈中,输出其值后再弹出。代码:#include#include using namespace std;struct Node{ int key; Node *left; Node *right; Node(原创 2015-05-31 19:40:49 · 2027 阅读 · 0 评论 -
算法导论--10.3-4 多数组表示双向链表(紧凑)
问题:双向链表的所有m个元素在存储器中保持紧凑,即在多数组表示中占用前m个下标思路:分配内存: 总是分配相邻的存储位置; 释放内存:若删除链表中的一个元素,导致存储位置中间空了一个,让数组的最后一个元素补上,并修改其prev和next值代码:#include#include using namespace std;int n=15, f=-1, head=-1;/原创 2015-05-31 16:02:16 · 962 阅读 · 0 评论 -
算法导论 基数排序 习题8.3-4
问题: 在O(n)时间内,对0到n^3-1区间内的n个整数进行排序思路:线性时间,考虑使用基数排序,基数排序时间为,要使时间为O(n),,即k=n, 即把每个整数写成3位n进制数代码:原创 2015-05-17 19:08:10 · 989 阅读 · 0 评论 -
算法导论 10.2-7 单链表的逆转
问题: 给出一个时间的非递归过程,实现对一个含n个元素的单链表的逆转思路:逆转即把结点的next指针指向前一个结点,在做逆转的时候要先储存下之前的next指向的值。 逆转后的表头为之前单链表的最后一个元素。代码:#includeusing namespace std;//先实现一个单链表(为了强化对链表的理解)struct Node{ Node原创 2015-05-31 14:33:01 · 928 阅读 · 0 评论 -
LeetCode---哈希表(hash table)
1.题目:包含重复(Contains Duplicate 2) Given an array of integers and an integer k, find out whether there there are two distinct indices i and j in the array such that nums[i] = nums[j] and the d原创 2015-06-17 15:10:04 · 1481 阅读 · 0 评论 -
算法导论 改进快排(3)---栈深度 习题7-4
问题:快排算法包含了两个对自身的递归调用,每次递归调用的信息存入栈中,操作系统给程序的栈空间是有限的,如果数组很大的话,则很容易造成栈溢出,这样程序就崩 溃了。思路:QUICKSORT中的第二个递归用一个循环控制结构来代替---尾递归代码实现尾递归:#include#include#includeusing namespace std;//交换两个数(不用中间转载 2015-05-17 14:44:36 · 650 阅读 · 0 评论 -
算法导论 用两个队列实现一个栈 10.1-7
问题:用两个队列实现一个栈思路:队列是先进先出,栈是后进先出。将Q.tail当成S.top,则出栈和队列的删除相同。入栈,要通过一个空的队列L1和另一个存有之前值的队列L2,设值x要存入栈中,则先将x存入空的队列L1中,再依次将L2的值取出加入到L1中。代码:原创 2015-05-27 14:18:04 · 467 阅读 · 0 评论 -
算法导论 改进快排(2)----针对相同元素值 7.2
问题:序列中有较多相同元素值时,随机化快排的性能下降思路:PARTION将序列分为三个部分A(p,q,t,r),A[p,...,q-1]中元素都小于A[q],A[q,...,t]中元素都相等,A[t+1,...,r]中元素都大于A[q]。QUICKSORT只对分区内互不相同的元素才做递 归。代码:原创 2015-05-16 16:23:31 · 638 阅读 · 0 评论 -
股票什么时候买进什么时候卖出收益最大----求最大子数组(算法导论第四章 4.1-3)
问题描述:某公司股票,给出n天内的股票价格,判断什么时候买入股票,什么时候卖出股票收益最大 天01234价格10117106变化 1-43-4问题转换: 将变化原创 2015-05-05 15:13:12 · 3752 阅读 · 0 评论 -
算法导论第二章2-4 逆序对(c++)
问题描述:给出一个确定在n个元素的任何排列中逆序对数量的算法,最坏情况需要 c*nlgn时间(提示,修改归并排序)思路: 看到lgn,想到用分治法。分治法的三个步骤——分解,解决,合并。最关键想清楚合并如何进行。合并:在归并排序中合并时,左边序列第一个值若大于右边序列第一个值,则左边序列所有值与右边序列第一个值都构成逆序对。#includeusing namespace std;原创 2015-04-20 16:55:12 · 1151 阅读 · 0 评论