博文

阶乘的两种算法(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)        {            ......

阅读全文(2761) | 评论:1

基本的算法归纳总结(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......

阅读全文(2181) | 评论:0

排序算法小结(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......

阅读全文(1242) | 评论:0

算法:元素选择问题总结(2006-07-29 02:09:00)

摘要:元素选择问题 注:中位数:中间大小的数 ;上取整用|  |表示,下取整用[ ]表示 1.选最大输入:n个不等的数输出:max算法1    Findmax1. max←L[1]2. for i←2 to lenth[L]        do if max ......

阅读全文(1818) | 评论:0

《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存累加和*/    ......

阅读全文(2799) | 评论:0

我所理解的归并排序算法(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[]......

阅读全文(3360) | 评论:0

我所理解的堆排序算法(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 ......

阅读全文(2607) | 评论:1

我所理解的快速排序算法(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)            &......

阅读全文(2007) | 评论:0

我所理解的插入排序算法(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]设置为临时数据......

阅读全文(4010) | 评论: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 {    ......

阅读全文(1442) | 评论:0