博文
阶乘的两种算法(2006-07-30 02:11:00)
摘要:/***作者:twopiece12**版本:0.9**/# include <conio.h># include <malloc.h># include <stdio.h># define MAX 100main(){ int *a; int i,k,count,j = 1; int n; int temp; a = (int *)malloc(sizeof(int)*MAX); printf("please input the number of n which you want to used to calculate the n! \n"); scanf("%d",&n); for (i=0; i<MAX; i++) { a[i] = 0; } a[MAX-1]=1; while (j <= n) { i = 1; while ( MAX-i >= 0) {  ......
基本的算法归纳总结(2006-07-29 02:11:00)
摘要:基本的算法归纳总结一下:
一、排序算法:(1)冒泡排序法(2)选择法(3)插入排序
二、查找算法:(1)顺序查找(2)二分查找(有序数列查找)
三、字符串操作(1)求串长(2)串连接(3)串拷贝(4)求子串(5)串比较
四、斐波那契数列(1)使用单变量(2)使用数组(3)使用递归函数
五、求最大数最小数算法(1)求最大数最小数(2)求最大数最小数所在的位置
六、杨辉三角形(1)使用一维数组(2)使用二维数组
七、倒序算法(1)倒序一个整数数组(2)倒序一个字符串
八、矩阵的操作(1)求最大数的行列下标(2)转置矩阵
这些算法我将一一动手写出来.若有更好的,更快的,高效的算法都可以贴出来.
一、排序算法:(1)冒泡排序法(2)选择法(3)插入排序
(1).#include #include
int Bubble(int source[],int n) { int start=0,end=n-1; int i; int count=0; while(start......
排序算法小结(2006-07-29 02:09:00)
摘要:排序算法小结 排序小结 排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。 而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。
对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。 我将按照算法的复杂度,从简单到难来分析算法。 第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。 第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种算法因为涉及树与堆的概念,所以这里不于讨论。 第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个问题。 第四部分是我送给大家的一个餐后的甜点——一个基于模板的通用快速排序。由于是模板函数可以对任何数据类型排序(抱歉,里面使用了一些论坛专家的呢称)。 现在,让我们开始吧: 一、简单排序算法由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。
1.冒泡法:这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡:#include
void BubbleSort(int* pData,int Count){ int iTemp; for(int i=1;i { &n......
算法:元素选择问题总结(2006-07-29 02:09:00)
摘要:元素选择问题
注:中位数:中间大小的数 ;上取整用| |表示,下取整用[ ]表示
1.选最大输入:n个不等的数输出:max算法1 Findmax1. max←L[1]2. for i←2 to lenth[L] do if max ......
《C程序设计》第五章第六章算法总结(2006-07-29 01:58:00)
摘要:第五章 选择结构
1. 求闰年
判别某一年year是否为闰年。条件是:
能被4整除,但不能被100整除;能被400整除。
if((year%4==0&year%100!=0)||(year%400)==0)printf("%d is a leap year",year);elseprintf("%d is not a leap year",year);
2. 交换法
空杯原理:要交换a、b杯的水,要借助第三个杯cup,先把a杯的水倒入到cup中,此时a空,再把b杯的水倒入a中,此时b空,最后把cup中的水倒入b杯,这样就实现了a、b杯水的交换。
例1:按代数值由小到大次序输出两个数。
if(a>b) {cup=a;a=b;b=cup;}
例2:求三个数a,b,c由小到大顺序输出。
用交换法,算法是,使最小值赋值给a,第二小赋值给b,最大值赋值给c。
所以a 先与b 比较,如果a>b,就交换它们的值;然后a与c比较,如果a>c就互换。这两个步骤得到a最小。最后比较b和c,如果b>c,就交换它们的值。
if(a>b) {cup=a;a=b;b=cup;}if(a>c) {cup=a;a=c;c=cup;}if(b>c) {cup=b;b=c;c=cup;}
/* 这样,书本上的习题“输入四个整数,要求按由大小顺序输出。”就难不倒你了。 */
第六章 循环控制
1. 累加(循环应用一)
如书本上的例题:1+2+3+……+100
定义两个变量:sum存累加和;i为每一次循环的加数。
变量初始值:sum=0;i=1;
每次循环结束前,要计算下一次i的值。
While(i<=100)
{ sum=sum+i; /*sum存累加和*/
 ......
我所理解的归并排序算法(2006-07-29 01:48:00)
摘要:归并排序算法以O(nlogn)最坏情形运行时间运行,而所使用的比较次数几乎是最优的。它可以用递归的形式实现,形式简洁易懂。但是需要注意的是当用递归形式时,如果数据较多,则开销很大,实用性很差,所以我们一般采用非递归的形式。我这里两种形式都给出。 不管是递归还是非递归,归并排序算法中基本的操作是合并两个已经排序的数组。递归形式:template <class T>void MSort(T a[], int left, int right){ if (left < right) { int center = (left + right) / 2; MSort(a, left, center); MSort(a, center+1, right); Merge(a, left, center, right, right-left+1); }}template <class T>void MergeSort(T a[]......
我所理解的堆排序算法(2006-07-29 01:28:00)
摘要:
我所理解的堆排序算法 堆排序在最坏的情况下,其时间复杂度也能达到O(nlogn)。相对于快速排序来说,这是它最大的优点,此外,堆排序仅需要一个记录大小供交换用的辅助存储空间。 堆排序的数据结构是二叉堆,二叉堆的特点有两个,一个是它是一棵完全二叉树,另一个是它的根结点小于孩子结点,所以我们很容易找到它的最小结点----根结点;当然如果你想找到最大结点的话,那就要扫描所有的叶子结点,这是很费时间的,如果你想找的是最大结点的话,你最好把它弄成一个大顶堆,即一棵根结点大于孩子结点的完全二叉树。 二叉堆通常用数组来实现,它舍弃下标0,从下标1开始置数,则很容易满足,对于数组中任意位置i上的元素,其左儿子的位置在2i上,右儿子的位置在2i+1上,双亲的位置则在i/2上。 堆排序的算法之一是把数组构建成二叉堆----这只要增添一个长度为n+1的辅助空间,然后把原数组的元素依次插入到二叉堆即可。然后删除二叉堆的根,把它作为排序后的数组的第一个元素,然后使二叉堆的长度减1,并通过上移使得新得到的序列仍为二叉堆,再提取新二叉堆的第一个元素到新数组。依此类推,直到提取最后一个元素,新得到的数组就是排序后的数组。template <class T>void Insert(T a[], int len, T x)//把x插入到原长度为len的二叉堆,注意保证新二叉堆不越界{ int i; for (i=len; i/2>0 && a[i/2]>x; i/=2) a[i] = a[i/2]; a[i] = x;}
template <class T>T DeleteMin(T a[], int ......
我所理解的快速排序算法(2006-07-29 01:27:00)
摘要:
我所理解的快速排序算法 快速排序是在实践中最快的已知排序算法,它的平均运行时间是O(NlogN)。该算法之所以特别快,主要是由于非常精练和高度优化的内部循环。在队列中寻找合适的枢点元素,并按枢点元素划分序列,是快速排序算法的关键。 为简单起见,我这里数组的第一个元素作为枢点元素,重新排列数组,使得枢点元素之前的元素都小于枢点元素,而枢点元素之后的元素都大于或等于枢点元素。 在这里我提供算法的两种实现:第一种:template <class T>int Parttion(T a[], int low, int high){ T x = a[low];
while (low < high) { while (low < high && a[high] >= x) high--; a[low] = a[high];
while (low < high && a[low] < x) &......
我所理解的插入排序算法(2006-07-29 01:26:00)
摘要:插入排序是一种简单的排序方法,因为的实现比较简单,所以在数据量较少时应用很广泛。插入排序根据其插入的不同方式,可以分为直接插入排序,折半插入排序,2-路插入排序,表插入排序和希尔排序。在这里我将一一写出各种插入排序的算法代码。直接插入排序template <class T>void InsertSort(T a[], int len){ int i, j; T temp; for (i=1; i<len; i++) { temp = a[i]; for (j=i-1; j>=0 && a[j]>temp; j--)//元素后移 a[j+1] = a[j]; a[j+1] = temp; //插入 }} 有些算法把a[0]设置为临时数据......
[转载]常用算法设计方法 - 迭代法(2006-07-29 01:15:00)
摘要:迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行: (1) 选一个方程的近似根,赋给变量x0; (2) 将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0; (3) 当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。 若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。上述算法用C程序的形式表示为: 【算法】迭代法求方程的根 { x0=初始近似根; do { x1=x0; x0=g(x1); /*按特定的方程计算新的近似根*/ } while ( fabs(x0-x1)>Epsilon); printf(“方程的近似根是%f\n”,x0); } 迭代算法也常用于求方程组的根,令 X=(x0,x1,…,xn-1) 设方程组为: xi=gi(X) (I=0,1,…,n-1) 则求方程组根的迭代算法可描述如下: 【算法】迭代法求方程组的根 { for (i=0;i<n;i++) x=初始近似根; do {  ......
