3.对拆法<2004.9.29>(注:接......(二))
这种"算法"目前在谭浩强教授主编的<C程序设计>中,主要用在对一系列数组进行排放. 我给这种方法下的定义是将一组数组数据对开各一半的进行运算的思路,称为"对拆法". 下列,我们先看一道例题: #include<stdio.h> void inv(int *x,int n) {int *p,temp,*i,*j,m=(n-1)/2; int i=x;j=x+n-1;p=x+m; for(;i<=p;i++,,j--) {temp=*j;*i=*j;*j=temp;} return; } main() {int i,a[10]={3,7,9,11,0,6,7,5,4,2}; inv(a,10); printf("the array has been inverted:\n"); for(i=0;i<10;i++) printf("%d",a[i]); printf("\n");}
大家可以看一下子函数inv(......);它采用的就是"对拆法".原理(或称实现过程)是找到一个数组的中间值作为标志;然后,将最后的一个数与最前面一个数进行调换......这个程序中,m的值是中间值,j的值是该数组的最后一个数组.i的值是该数组最前面的一个.(当然,我这里分析的是初始值.) 我们大家都知道,"举一反三"的这个道理.我相信,这种方法一定可能在解决其它一些问题上得到应用.
4.筛选法<2004.9.29>
这种方法我个人认为应用得比较广泛.我根据个人的想法,给这种算法下的定义是为了进行实现某个问题,将一组可能实现问题的庞大的集合逐步分拆成一个一个相对比较小的范围进行分析,筛选出结果值,再缩小范围,再筛选;最后得出解决问题的比较全面的结果. 下面我们要看一个例子(用于实现对几个元素进行排序). main() {int ri[]={1,5,7,9,10,8,11,21,6,9}; int i,j; for(i=0;i<=9;i++) for(j=i;j<=9;j++) {if(ri[i]<ri[j]) ri[i]=ri[j];....(略)}}
大家可以看两个FOR循环语句,它这个程序的实现过程是:首先将第一个数组去与所有的数组作比较,如果大于它就替换,这样就得出了第一个数组10个数组元素中最大的一个;接着,将第一个元素筛选出来,将第二个元素再去与从第二个元素开始的范围进行比较.按照这种思路;最后就实现了我们需要的结果值.(未完待续(四)
------------------------------------------------------------
个人主页:wwweye.126.com
QQ:4360538
-------------------------------------------------------------