随笔分类 - 积累
1
摘要:归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。 1 //将有序数组a[]和b[]合并到c[]中 2 void MemeryArray(int a[], int n, int b[], int m, int c[]) 3 { 4 int i, j, k; 5 6 ...
阅读全文
摘要:插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) 。使用插入排序为一列数字进行排序的过程分类排序算法数据结构数组最差时间复杂度最优时间复杂度平均时间
阅读全文
摘要:快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。步骤为:从数列中挑出一个元素,称为 "基准"(pivot),(定基准,有随机版本)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元
阅读全文
摘要:二叉堆是一种数据结构。 ___________________________________________________________________________________________________________________________________堆:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全二叉树,树中每个结点与数组中存放该结点值的那个元素对应。二叉堆有两种:最大堆和最小堆(小根堆)。堆的高度堆可以被看成是一棵树,结点在堆中的高度可以被定义为从本结点到叶子结点的最长简单下降路径上边的数目;定义堆的高度为树根的高度。我们将看到,堆结构上的一..
阅读全文
摘要:约定:x%y为x取模y,即x除以y所得的余数,当x1) {//一直计算,直到指数小于或等于1 if((p%2)!=0) {// 如果指数p是奇数,则说明计算后会剩一个多余的数,那么在这里把它乘到结果中 odd*=main; //把“剩下的”乘起来 } main*=main; //主体乘方 p/=2; //指数除以2 } return main*odd; //最后把主体和“剩下的”乘起来作为结果}够完美了吗?不,还不够!看出来了吗?main是没有必要的,并且我们可以有更快的代码来判断奇数。要...
阅读全文
摘要:int prime(int n){ int i; if(n == 2) return 1; if(n%2 == 0) return 0; for(i=3; i*i 0;i++) 5 { 6 t[i]=n%10; 7 n/=10; 8 } 9 len = i;10 for(i=0,j=len-1;isqrt(i) ) prime[num++] = i; //这个prime[]是int型,跟下面讲的不同。 } 这就是最一般的求解n以内素数的算法。复杂度是o(n*sqrt(n)),...
阅读全文
摘要:问题: 将所有回文数从小到大排列,求第N个回文数。 一个正数如果顺着和反过来都是一样的(如13431,反过来也是13431),就称为回文数。约束: 回文数不能以0开头。 最小回文数是1。思路: 许多朋友(包括我自己)一开始就思考使用循环:从1开始,判断该数是否是回文数,然后用一个计数器记下回文数,一直到计数器得到N,返回第N个回文数。比较常用的是以下这种方法来判断是否回文数:staticbooleanisPN(intnum){into=num;inttmp=0;//使用循环把数字顺序反转while(num!=0){tmp*=10;tmp+=num%10;num/=10;}//如果原始数与反转后
阅读全文
摘要:深度优先算法入门的一道非常好的题目,还考虑到了剪枝http://acm.hdu.edu.cn/showproblem.php?pid=1010 1 //这个代码是没有考虑任何剪枝的 2 //将所以情况都遍历了一遍, 3 //提交的时候是会超时的 Time Limit Exceeded 4 #include 5 #include 6 using namespace std; 7 8 #define MAX 10 9 char mapz[MAX][MAX];10 int N,M,T;11 int dx, dy;12 bool escape;13 14 void dfs(int sx, int ..
阅读全文
摘要:C语言的初学者经常会问一些貌似“专业”的问题,比如#includemain(){inti=5;intj=++i+++i+++i;printf("%d\n",j);system("pause");}这样的问题实在不需要多做考虑,而且应该在实际编程实践中尽量避免。因为它们几乎都是“未指明的行为”或“由实现定义的行为”。另一方面,程序的错误或Bugs,通常是由于“未定义的行为”。C++Primer第四版中的解释:使用了未定义行为的程序都是错误的,即使程序能够运行,也只是巧合。未定义行为源于编译器不能检测到的程序错误或太麻烦以至无法检测的错误。不幸的是,含有未定
阅读全文
摘要:你认为为什么C++不叫做++C?看到这个习题,顿感眼前一亮(不禁想起某些国内书籍的题目,真是平淡如水),这对于理解前自增操作与后自增操作而言着实是个好的题目。想弄明白这个问题,就需要先理解一些基础的概念。什么是自增操作呢?++操作符,即自增操作符。自增操作符有两种形式:前置操作和后置操作。前自增操作生成左值,在给操作数加1后返回改变后的操作数值。后自增操作生成右值,给操作数加1但返回未改变的操作数原值。*事实上,因为C++具有操作符重载的功能,自增操作不仅仅可以表示加1前置操作返回的是加1后的值,返回的是对象本身,所以这是左值。后置操作返回的是加1前的值,其返回值可以近似的理解为与原操作数值相
阅读全文
摘要:1、动态申请一维内存(1)、用malloc函数#include #include #include int main(){ int n=5; int *temp; temp=(int*)malloc(sizeof(int)*n); for(int i=0;iusing namespace std;int main(){ int n=5; int *temp; temp=new int[n]; for(int i=0;i#include #include int main(){ int n=5; //n表示行 int **temp...
阅读全文
摘要://这里有两个代码,//下面的明显精简很多#include#includeint main(){ int B, i=0, num, tmp[10]; scanf("%d",&B); scanf("%d", &num); while(num>0) { tmp[i++]=num%B; num/=B; } for(i--;i>=0;i--) printf("%d",tmp[i]); printf("\n");}1 void Change( int n )2 {3 int m;4 m = n;
阅读全文
摘要://已知新数组b[i][j]//顺时针旋转//90°//原数组的列为新数组的行//原数组的行=N-1-新数组的列//180°//原数组的行=N-1-新数组的行//原数组的列=M-1-新数组的列//270°//原数组的列=M-1-新数组的行//原数组的行=新数组的列//得出结论/*顺时针选择90° = 转置 + 水平翻转逆时针旋转90° = 转置 + 垂直翻转 = 顺时针旋转 270°*///矩阵的旋转//顺时针旋转90°#includeint main(){ int i,j; int a[3][3]={{1,2,3},{4,
阅读全文
摘要:分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必须用struct Student stu1;来声明) 这里的Stu实际上就是struct Student的别名。Stu==struct Student 另外这里也可以不写Student(于是也不能struct Student stu1;了,必须是Stu stu1;) typedef struct...
阅读全文
摘要:FILE* pfile=fopen("dict.txt","r"); while (!feof(pfile)){fscanf(pfile,"%s",name[i]);++i;}这里的 feof是一个函数feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为非零值,否则为0。feof(file stream )文件指针到达文件末尾!feof(fp) 表示没有到达末尾 FILE* pfile=fopen("dict.txt","r");//这里先用fopen打开一个文件 whil
阅读全文
摘要:当我们求解acm题目时,通常在设计好算法和程序后,要在调试环境(例如VC等)中运行程序,输入测试数据,当能得到正确运行结果后,才将程序提交到oj中。但由于调试往往不能一次成功,每次运行时,都要重新输入一遍测试数据,对于有大量输入数据的题目,输入数据需要花费大量时间。 使用freopen函数可以解决测试数据输入问题,避免重复输入,不失为一种简单而有效的解决方法。 函数名:freopen 声明:FILE *freopen( const char *path, const char *mode, FILE *stream ); 所在文件: stdio.h 参数说明: path: 文件...
阅读全文
摘要:1 C++中新定义的方法都是有名字空间的 比如cout就属于std名字空间 如果include头文件的时候加上.h,默认会using namespace 否则需要自己加上 using namespace XXX 对于C中已经定义的方法如printf,没有影响的 2 3 iostream.h是包含输入/输出流处理的头文件,iostream就什么都不是了 4 但用iostream要加名词空间namespace 5 6 #include 7 或者是 8 #include 9 using namespace std; 10 二者都行 11 12 #include是C...
阅读全文
摘要:puts 和 printf 的用法一样,puts()函数的作用与语句“printf("%s\n",s);的作用相同。注意:puts在输出字符串后回车符。当puts遇到\0时,会输出一个\n,也就是换行。所以puts( "" )时,因为字符串本身长度为0,所以第一个字符就是\0,puts会输出一个\n,所以起到了换行的效果。也就是说, puts( "" )跟puts( "\0" )是等效的,也等效printf( "\n" )
阅读全文
摘要:1。void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。2。例子#includevoid main(){char *s="Golden Global View";clrscr();memset(s,'G',6);printf("%s",s);getchar();return 0;} 3。memset() 函数常用于内存空间初始化。如:char str[100];memset(str,0,100);4。memset()的深刻内涵:用来对一段内存空间全部设置为
阅读全文
摘要:学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行)转载请保留作者信息;1、cin1、cin.get()2、cin.getline()3、getline()4、gets()5、getchar()1、cin>>用法1:最基本,也是最常用的用法,输入一个数字:#include using namespace std;main (){int a,b;cin>>a>>b;coutusing namespace std;main (){char a[20
阅读全文
1

浙公网安备 33010602011771号