C语言排序算法
I T 技 术
2007 NO.11
科技咨询导报
C语言中实现“三个数由小到大排序”的多种方法浅析
史文集
(黑龙江工程学院 黑龙江哈尔滨 150001)
摘 要:本文通过一个简单示例“三个数由小到大排序”,将C语言中许多知识点融会贯通起来,这多种方法的实现可以将函数、宏、指针之间的区别和本质清晰的展示给读者,使本来很复杂难以理解的概念变得通俗易懂。关键词:函数 交换数据 交换地址 宏 指针中图分类号:TP316文献标识码:A文章编号:1673-0534(2007)04(b)-0023-01
在学习C语言的过程中,各章节的知识点似乎有些彼此脱节、孤立,教师若在讲解完各章节后,做一个总结,特别是以一个实际的例子作讲解,分别用不同的方法来实现,可以收到一个事半功倍的效果,以下就以“三个数由小到大排序”为例,分别通过“不使用函数”、“定义函数”、“使用宏”三大类方法,而每一类中又有多种不同的方法,进而讲解一下该方法的使用和实现。
Scanf("%d,%d,%d",&a,&b,&c);P1=&a;p2=&b;p3=&c;
If(a>b){p=p1;p1=p2;p2=p;}If(a>c){p=p1;p1=p3;p3=p;}If(b>c){p=p2;p2=p3;p3=p;}
Printf("%d,%d,%d",*p1,*p2,*p3);}
2 定义一实现交换功能的函数
该程序中将三个数的地址作为实参,通过函数调用将实参地址传给形参,从而实现实参、形参共占一段内存,真正作到一改全改。但必须遵循“单向传递”的原则。
源程序如下:
/* jh.c */Swap(p1,p2)Int p1,p2;{
Int p;
P=*p1;*p1=*p2;*p2=p;}
#include"jh.c"main(){
Int a,b,c,*p,*p1,*p2,;
Scanf("%d,%d,%d",&a,&b,&c);P=&a;p1=&b;p2=&c;If(a>b)swap(p,p1);If(a>c) swap(p,p2);If(b>c) swap(p1,p2);
Printf("%d,%d,%d",a,b,c);}
1 不使用函数调用
1)直接交换数据
这种方法是学生刚开始学习C语言时,首先接受并能很快掌握的方法,对这一方法需掌握其精髓,其后的多种变形都是以它为原型。
源程序如下:main(){
Int a,b,c,t;
Scanf("%d,%d,%d",&a,&b,&c);If(a>b){t=a;a=b;b=t;}If(a>c){t=a;a=c;c=t;}If(b>c){t=b;b=c;c=t;}
Printf("%d,%d,%d",a,b,c);}
2)通过交换两数据的地址
通过交换数据的地址来排序,这对学生来说是一个思维模式的转换,此处我们巧妙的引入指针,使学生感觉指针虽然是一个很陌生的概念但它所能解决的依然是一个很简单、很实际的问题。指针并不一定代表复杂,我们只是从另一个角度来描述或解决一个问题而已。本例当中,指针变量p1、p2、p3经过交换后将不再存放变量a、b、c的地址,而是分别存放最小数、第二小数和最大数的地址。
源程序如下:main(){
Int a,b,c,*p,*p1,*p2,*p3;}}
如果有一条非活动边的形式为[S-->α ,0,n],则接受该边作为句法分析结果。
下面我们举例说明该算法。设句法分析规则如下:
[1] det --> the[2] adj --> old[3] noun --> old[4] noun --> man[5] verb --> man[6] noun --> boat[7] NP --> det noun[8] NP --> det adj noun
3 使用宏定义
使用宏定义既可通过交换地址、交换数据实现,也可通过实参是地址变量,交换数据实现,也就是说,使用宏定义与使用函数最大的不同就是,使用宏定义既可实现实参是地址(或变量)交换地址(变量),也可实现实参是地址,交换变量,而不必遵循“单向传递”的原[9] VP --> verb NP[10] S --> NP VP
现在分析句子“the old man theboat”如表1。
线图(21)[S --> NP VP ,0,5]的形式为[S-->α ,0,n],接受该线图作为句法分析结果。线图(14)[S --> NP VP ,0,3]仅覆盖了“the old man”,没有覆盖整个句子,不接受其作为句法分析结果。
如何提高句法分析器的速度是未来工作的一个重要内容,可以采用文献[6]的方法缩减句法分析规则,这种方法可以在提高句法分析器的速度的情况下,不降低句法分析器的性能;同时,高效的剪枝算复
则。
1)交换地址
#define swap(x,y){p=x;x=y;y=p}main(){
Int a,b,c,*p,*p1,*p2,*p3;
Scanf("%d,%d,%d",&a,&b,&c);P1=&a;p2=&b;p3=&c;If(a>b) swap(p1,p2);If(a>c) swap(p1,p3);If(b>c) swap(p2,p3);
Printf("%d,%d,%d",*p1,*p2,*p3);}
2)交换数据
#define swap(x,y){t=x;x=y;y=t}main(){
Int a,b,c,t;
Scanf("%d,%d,%d",&a,&b,&c);If(a>b) swap(a,b);If(a>c) swap(a,c);If(b>c) swap(b,c);
Printf("%d,%d,%d",a,b,c);}
3)实参是地址,交换数据
#define swap(x,y){p=*x;*x=*y;*y=p}
main(){
Int a,b,c, p,*p1,*p2,*p3;
Scanf("%d,%d,%d",&a,&b,&c);P1=&a;p2=&b;p3=&c;If(a>b) swap(p1,p2);If(a>c) swap(p1,p3);If(b>c) swap(p2,p3);
Printf("%d,%d,%d",a,b,c);}
参考文献
[1] 谭浩强.C语言教程.也是未来的重要工作内容。
参考文献
[1] Tanaka Hozumi. Current trends on
parsing: a survey. Technical report.Tokyo Institute of Technology,1993.[2] 赵铁军.机器翻译原理.哈尔滨工业大学出
版社,2000.
科技咨询导报 Science and Technology Consulting Herald23