算法
文章平均质量分 71
liuzhanchen1987
这个作者很懒,什么都没留下…
展开
-
大牛的博客
http://blog.csdn.net/v_JULY_v?viewmode=contents原创 2012-03-06 16:54:23 · 741 阅读 · 0 评论 -
算法导论第七章例题——快速排序
快速排序的平均意义上的时间复杂度是nlgn,最差意义上的时间复杂度是n*n,算法的好坏取决于所选取的用于划分数组的元素的大小。算法的思路是:将数组按照某个元素划分为两个部分,并单独对这两个部分数组进行就地排序,就地排序时重复利用划分的方法将数组分为更小的两部分。本代码中为了使代码具有平均意义上的时间复杂度,添加了RandomizedPartition函数进行优化,该函数的思路是随机选取介于原创 2012-07-02 14:16:34 · 2284 阅读 · 0 评论 -
算法导论习题8.3-4
对0到n^2-1范围内的数字进行排序,要求时间复杂度为O(n)。可以直接采用基数排序法对其排序,但是这些数字为已知范围,所以有更进一步的优化,即将所有的数字转换成n进制,这样这些数在n进制下只有两位,即只需要比较2O(n)即可。转换成n进制消耗2O(n),所以对于比较的数字为四位以上时,该算法较普通的基数排序有优势。具体代码如下:修改:此处的插入排序应该改为计数排序。因为插入排序时间复原创 2012-07-04 09:30:08 · 3511 阅读 · 0 评论 -
算法导论习题8-3—排序不同长度的数据项
题目:a)给定一个整数数组,其中不同的整数中包含的数字个数可能不同,但是该数组中,所有整数中总的数字数为n。说明如何在O(n)时间内对该数组进行排序b)给定一个字符串数组,其中不同的串包含的字符个数可能不同,但所有串中总的字符个数为n。说明如何在O(n)时间内对该数组进行排序(注意此处的顺序是指标准的字母顺序,例如,a 思路:a)先用桶排序方法按数字位数排序O(n),再用原创 2012-07-04 16:59:37 · 2676 阅读 · 4 评论 -
算法导论第二章课后习题代码实现
插入排序代码实现:#includeusing namespace std;void Insert_sort(int a[],int length){ int i,j,key; for(i=1;i<length;i++) { key=a[i]; j=i-1; while(key<a[j]) { int temp; temp=a[j+1]; a[j+1原创 2012-06-29 11:27:13 · 1263 阅读 · 2 评论 -
算法导论例题及课后习题代码实现——第六章
例题1,堆排序,在该堆排序中Max_Heapify函数分别用递归和循环实现 #includeusing namespace std;#define Left(i) i*2+1#define Right(i) i*2+2#define Parent(i) (i-1)/2void Max_Heapify(int a[],int length,int i){ int left,ri原创 2012-06-29 22:33:10 · 1175 阅读 · 0 评论 -
算法导论第六章之——优先队列
优先队列类模版实现:BuildMaxHeap.h头文件:#includeusing namespace std;#define Left(i) i*2+1#define Right(i) i*2+2#define Parent(i) (i-1)/2void Max_Heapify(int a[],int length,int i){ int left,right; left原创 2012-06-30 19:53:28 · 833 阅读 · 1 评论 -
算法导论习题7-3 Stooge-Sort
stooge-sort的主要思想是分治,将数组划分为三个区间,对前两个区间中的第一个元素和最后一个元素比较,如果第一个大于最后一个互换位置,然后对后两个区间中的第一个和最后一个元素比较,如果第一个大于最后一个互换位置,然后再对前两个区间中的第一个元素和最后一个元素比较,如果第一个大于最后一个互换位置,以上所述的步骤是递归执行的,最底层的递归是三个元素的比较:比如为3,1,2.先比较3,1, ,并互原创 2012-07-02 15:10:45 · 3099 阅读 · 0 评论 -
算法导论习题7-6
题目:考虑这样一种排序问题,即无法准确的知道等排序的各个数字到底是多大.对于其中的每个数字,我们只知道它落在实轴上的某个区间内.亦即,给定的 n 个形如[ai, bi ]的闭区间,其中ai,≤bi .算法的目标是对这些区间进行模糊排序(fuzzy-sort),亦即,产生各区间的一个排序1, i2, i3, i4,…in >,使得存在一个 cj ∈[ai, bi ],满足c1≤c2≤原创 2012-07-03 12:12:08 · 1060 阅读 · 0 评论 -
算法导论习题7-4—快排中堆栈深度的优化
//Quick_sort//time complexity is nlgn//the way is find an element,and partition the array according to this element#includeusing namespace std;int Partition(int a[],int p,int r){ int num=a[r];原创 2012-07-02 20:01:02 · 2789 阅读 · 2 评论 -
算法导论第八章—计数排序
该算法是以空间换取时间的算法,其时间复杂度为O(n),时间复杂度优于所有比较排序。但是占用空间很大,特别当数组中数据不是很紧凑时,占用空间更大具体代码如下,代码原理见注释://计数排序//算法时间复杂度是O(n)//该算法是典型的以空间换取时间的算法空间占有O(n*2+k)//特别当k很大时,该算法占有空间很大#includeusing namespace std;void C原创 2012-07-03 15:45:16 · 1071 阅读 · 3 评论 -
二分查找算法递归和非递归实现(C++)
二分查找算法代码:#include using namespace std; //非递归实现 int FindElement(int a[],int first,int end,int target) { int mid,value; int L=first,R=end; while(L<R) { mid=(L原创 2012-03-20 19:25:19 · 4917 阅读 · 3 评论 -
算法导论习题6—3 Young氏矩阵
Young氏矩阵具有从左到右元素顺次排列,从上到下元素顺次排列。该代码实现了从矩阵中抽取最小元素,并重新调整young氏矩阵,插入元素并重新调整矩阵,查找元素。这三个函数的时间复杂度都是lg(m+n),其中m是矩阵行数,n是矩阵列数。//Young氏矩阵,性质从左到右顺序排列,从上到下顺序排列#includeusing namespace std;#define M 100#defin原创 2012-07-02 13:57:57 · 985 阅读 · 1 评论 -
算法导论第八章——基数排序
基数排序的原理是:假设所有要排序的数字位数为d位,不足的数字高位补0,从第一位开始,以该位为基准对数组进行排序(意思是将所有的数中的第1位提取出来,并按照大小进行排序,每一位所对应的数组元素也相应的改变次序),在排序好之后在选取第二位,以第二位为基准进行排序,一次类推,直到按照d位排序之后,数组的排序完成。由于基数排序为稳定算法,所以在对每一位进行排序时,也应该选取稳定的排序算法进行排序。本代原创 2012-07-03 21:55:17 · 1684 阅读 · 0 评论 -
排序法系列之二----插入排序(直接插入,希尔排序,二分插入,链表插入排序)的C++代码实现
插入排序法包括:直接插入法(稳定),希尔排序法(不稳定),二分插入排序(稳定),链表插入排序有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳原创 2012-03-19 15:45:59 · 7160 阅读 · 5 评论 -
中缀树转后缀树
对于一个中缀表达式 a+b*c*(d-e/f) 转换成后缀是这样的形式 abc*def/-+后缀表达式是相当有用处的,转换成后缀表达式后求值会简单很多.那么该如何转换呢? 网上关于这方面的资料一搜一大把,每本数据结构的书中都会提及这个算法,在这个算法中,用到 栈 这个数据结构. 1,关键是比较运算符的优先级,谁的优先级高,谁就出现在前面上面的表达式中,有括号的时候括号优先级最高原创 2012-03-24 14:07:41 · 1771 阅读 · 0 评论 -
后缀表达式实现六则运算
实现后缀表达式的类如下,该类计算的是已经处理好的后缀表达式。#include#include#includeusing namespace std;void StringDevide(string str,int &num,string st1[]){ for(int i=0;i<100;i++) st1[i][0]='\0'; int n=str.size(原创 2012-03-23 15:19:46 · 1433 阅读 · 0 评论 -
利用双向链表实现约瑟夫问题
输入n个数,围城一圈,输入数字m,从第一个数开始数,数到第m个数删除这个数,然后继续数,数到下一个第m个数时,删除该数,直到剩下最后一个数。输出最后一个数。利用双向循环链表实现:LinkNode.h#includeusing namespace std;templateclass LinkNode{public: Type m_data; LinkNode*m_原创 2012-03-25 14:25:49 · 3736 阅读 · 0 评论 -
哈希表
哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。 对哈希表的使用者一一人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快原创 2012-03-27 20:11:47 · 1646 阅读 · 2 评论 -
十进制整数如何利用位操作求的该整数的二进制中1的个数
此题可有多种方法,大概可以分为两种:一种是制表法,另一种就是通俗的数学方法。其中数学方法中一个简单明了的方法就是利用一个while循环,采用按位与的方式。代码如下:#includeusing namespace std;int main(){ int a; int count; while(cin>>a&&a) { count=0; while(a>0)原创 2012-03-16 20:46:44 · 2021 阅读 · 0 评论 -
排序法系列之三---选择排序
#includeusing namespace std;void ChoseSort(int *a,int length){ int FindMin(int *a,int v,int length); int i,j,temp,num; for(i=0;i<length;i++) { num=FindMin(a,i,length); temp=a[i];原创 2012-03-19 17:07:19 · 639 阅读 · 0 评论 -
排序法系列之五---快速排序法(C++代码实现)
快速排序的思想跟合并排序思想差不多,都是用的分治法。其大概思路是:首先找到数组中一个合适数字,然后将数组中小于该数的往前放,大于该数字的往后放。最后将该数字放在小于该数字和大于该数字的中间。这样数组分成两段,然后分别对这两段数组继续调用以上方法,直到完成排序。其实现关键是递归调用。具体C++代码如下: #includeusing namespace std;int Devide(i原创 2012-03-19 19:55:23 · 1281 阅读 · 0 评论 -
排序法系列之一-----冒泡排序法
直接上代码:#includeusing namespace std;void Bubble(int *a,int length){ int i,j; for(i=0;i<length;i++) { for(j=length-1;j>i;j--) { int temp; if(a[j]<a[j-1]) { temp=a[j];原创 2012-03-19 16:39:52 · 640 阅读 · 0 评论 -
排序法系列之四---合并排序法
分治策略:将原问题划分为n个规模较小而结构与原问题相似的的子问题,递归地解决这些子问题,然后再合并这些结果,就得到原问题的解。分支策略在每层递归上都实现以下三个步骤:分解:将原问题划分为多个子问题。解决:递归地解决各个子问题。若子问题足够小,则直接求解合并:将子问题的结果合并成原问题的解。合并排序完全依照了上述模式:分解:将n个元素分成各含n/2个元素的子序列解决:原创 2012-03-19 16:32:53 · 949 阅读 · 0 评论 -
排序法系列之六---堆排序(C++代码实现)
#includeusing namespace std;//return the parent of the ith elementint Parent(int i){ return i/2;}//return the left child of the ith elementint Left(int i){ return i*2;}//return原创 2012-03-19 10:32:12 · 1353 阅读 · 0 评论 -
排序法系列之七---基数排序法C++代码实现
#include#include#includeusing namespace std;//按照某位数将数字推入到队列中void VecToDeque(vector&vec,queuedeq[],int n){ vector::iterator it; for(it=vec.begin();it!=vec.end();it++) { int itor=(*原创 2012-03-10 22:09:27 · 4293 阅读 · 2 评论 -
分享一道很有意思的算法题目
题目:有100盏灯和100个开关,刚开始的时候等全是灭的,someone第一轮按下所有开关(开的按一下变灭,灭的按一下变开),第二轮隔一个按一下(偶数个按),第三轮隔2个(3的倍数个按),求第100轮之后有多少盏灯是亮的。本题有三个层次的解法:第一个层次是暴力解法,即循环100轮,分别记录每一盏等的状态,最后统计一下亮灯的个数即可。此方法为下策,代码不必赘述。第二个层次是加入一些分析技巧。原创 2012-10-19 21:45:55 · 4554 阅读 · 2 评论