| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1120 人关注过本帖
标题:[讨论]实现解决问题的算法(三)
只看楼主 加入收藏
竹本鸟
Rank: 1
等 级:新手上路
帖 子:72
专家分:0
注 册:2004-10-5
收藏
 问题点数:0 回复次数:9 
[讨论]实现解决问题的算法(三)

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

-------------------------------------------------------------

搜索更多相关主题的帖子: 算法 
2004-10-05 23:29
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8913
专家分:2567
注 册:2004-3-25
收藏
得分:0 
好文章,加入精华。

[此贴子已经被作者于2004-10-06 13:30:50编辑过]


畅所欲言
2004-10-06 13:27
竹本鸟
Rank: 1
等 级:新手上路
帖 子:72
专家分:0
注 册:2004-10-5
收藏
得分:0 
谢谢

个人主页:wwweye. C语言正在学习中...... --------------------------------------------------
2004-10-07 15:52
longhao
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2004-9-10
收藏
得分:0 
第四个是筛选法吗??应该不是吧,算是冒泡法吧~~

携手共进,陪伴彼此~
2004-10-09 21:03
竹本鸟
Rank: 1
等 级:新手上路
帖 子:72
专家分:0
注 册:2004-10-5
收藏
得分:0 
我在书上看到时候,提过“冒泡法”;可是我不知道是怎么进行的?现在,听这么一说,我觉得是挺像!

个人主页:wwweye. C语言正在学习中...... --------------------------------------------------
2004-10-12 16:24
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
以下是引用竹本鸟在2004-10-12 16:24:10的发言: 我在书上看到时候,提过“冒泡法”;可是我不知道是怎么进行的?现在,听这么一说,我觉得是挺像!

你的冒泡法可以改进一下,加监视变量count;对排基本有序的数组可以提高效率。

main() {int ri[]={1,5,7,9,10,8,11,21,6,9}; int i,j,count; for(i=0;i<=9;i++) {count=0;

for(j=i;j<=9;j++) {if(ri[i]<ri[j]) ri[i]=ri[j];....(略)count++;}

if(count==0)break;

}


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2004-10-13 12:36
taohuan
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2004-10-14
收藏
得分:0 
2004-10-14 20:25
CoolFlyTow
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2004-9-16
收藏
得分:0 
乌鸦丘比特果真高手,确实冒泡法如果加一个监视在一次内循环中是否移动了数据的话,将会大大提高有序性不较高的集合的排序速度。哈哈哈哈

2004-10-15 10:48
竹本鸟
Rank: 1
等 级:新手上路
帖 子:72
专家分:0
注 册:2004-10-5
收藏
得分:0 
我看了第6楼的贴子,觉得是有那么回事,减少了不必要的循环次数。

个人主页:wwweye. C语言正在学习中...... --------------------------------------------------
2004-10-16 22:44
jiangzhl
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2004-10-17
收藏
得分:0 

我看6楼是个高手了

楼主的文章不错,小弟正在学习。

我对算法都没有一个较全的认识,多谢楼主的帮助。

2004-10-17 10:43
快速回复:[讨论]实现解决问题的算法(三)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035868 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved