《c语言》数组在排序算法中的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《C 语言》数组在排序算法中的应用 第 4 页 共 4 页
《c 语言》数组在排序算法中的应用
五常职教中心学校 梁代红 [教学目标]
1、能力目标: 理解编程的基本方法,做到一题多解;掌握排序算法,通过不同方式实现排序算法,拓 宽学生的思维空间。 掌握在什么情况下要使用数组及在处理数组过程中如何控制下标的变化,提高学生分析 问题,解决问题,及用计算机实现问题的能力。 2、德育目标: 在课堂中鼓励学生互相合作,互相学习 [教学重点] 排序算法及通过循环变量对数组下标的控制来实现数组元素的处理。 [教学难点] 排序算法的实现过程。 [教学方法与手段] 用启发式、任务驱动的方式、提问法,促进学生思考,引导学生分析问题、解决问题; 以学生为主,老师为辅,结合多媒体课件演示,由浅到深地、循序渐进地讲解排序算法的实 现。 [教学过程 ] 一、复习上一节课的内容及讲评作业 二、引入课题 三、本节课的内容 四、练习 五、总结 六、知识的拓宽 七、作业 八、结束 一、复习: 3、数组的基本知识与数组元素的引用(讲述) 4、讲评练习:用数组的方式实现输入十个数,找出最小的一个数并打印输出。(至少用 两种方法解题)
• 指出作业存在的问题:
(1)循环变量设置与数组下标的引用结合 (2)存放最小值的变量要赋初值 (3)用行 if 语句还是用块 if 语句的问题 解法一: int a[10],i; for(i=1;i<10;i++)
scanf(“%d”,&a[i]); min=a[0]; for(i=1;i<10;i++)
if (min>a[i])
《C 语言》数组在排序算法中的应用 第 4 页 共 4 页
min=a[i]; printf( “最小值为:%d”,min); 解法二:
int a[10],i,p; for(i=1;i<10;i++)
scanf(“%d”,&a[i]); p=0; for(i=1;i<10;i++) if (a[p]>a[i]) p=i
复习总结:
在编程中,一些用变量不好处理的问题,引入数组后,就可以很容易解决。
二、引入课题 有这样一道例题:对三个数按从小到大顺序输出,程序: scanf(“%d%d%d”,&a,&b,&c); if (a>b) {t=a;a=b;b=t;} if (b>c){c=b;b=c;c=t;} if (a>b){t=a;a=b;b=t;} printf(“%d\t%d\t%d\n”, a,b,c);
思考:
三个数我们可以用 if 语句实现,那假如有十个数,有一百个数呢?
三、新课内容 1.题目: 2.分析题目 (1)如何产生一个 0——100 之间的随机正整数? random(m-n+1) (2) 确定要用数组解题,如何定义数组(几维?下标如何定义),如何存放十个随机数? int a[10],i; for( i=0;i<10;i++) a[i]=random(99);
(3) 为了使每一次产生的随机数不同,该怎么办?(提问) 在用随机函数之前用 randomize 语句打开随机数发生器。
(4)从小到大顺序进行排序(以比较法为例) ①在十个数当中选出一个最小的放在第一个元素位置。
具体的方法: 第一个元素的值与从第二个元素开始逐个进行比较,若有小于第一个元素值的进
行交换(如何进行两个变量值的交换?),完成后第一个元素就是十个数中的最小值。 程序:
i=0 for( j=1;j<9;j++)
if (a[i]>a[j]) {t= a[i];a[i]=a[j];a[j]=t;}
②除了第一个元素以外,第二个到最后一个元素当中再找出第二小的元素放在第二个 元素中(提出问题,由学生来修改)
《C 语言》数组在排序算法中的应用 第 4 页 共 4 页
程序:
i=1
for( j=2;j<9;j++)
if (a[i]>a[j]) {t= a[i];a[i]=a[j];a[j]=t;} ③依次类推,找到第三个、第四个…(只要修改程序段中的 i 的值与 j 的初值即可) 问题:
a、找出第一小值的元素要比较几次?找出第二小值的呢?第三个呢?
b、共要几趟才能把十个数按从小到大顺序排好?
c、变量 i 与变量 j 的变化之间有什么关系?
i 值的变化
0 1 2 345678i
j 值的初值
1 2 3 4 5 6 7 8 9 i+1
④写出对十个数进行升序排序的程序程序: for (i=0;i< 8;i++) for (j=i+1 ;j< 9;j++) if (a[i]>a[j]) {t= a[i];a[i]=a[j];a[j]=t;}
(5)如何打印输出? 程序: for (i=0;i< 9;i++) printf(“\t%d”,a[i]);
3.写出完整的程序:用比较法进行排序(三个程序段拼凑成一个完整的程序) int a[10],i; for( i=0;i<10;i++) a[i]=random(99); for (i=0;i< 8;i++) for (j=i+1 ;j< 9;j++) if (a[i]>a[j]) {t= a[i];a[i]=a[j];a[j]=t;}
for (i=0;i< 9;i++) printf(“\t%d”,a[i]);
4.算法分析 分析算法中循环次数: 外循为 n-1 次,内循环平均为 n/2 次 比较次数: (n-1)*n/2 次 及平均交换次数: (n-1)*n/4 比较法实现的效率: 花的时间较长,效率较低
四、练习: 随机产生 100 个[0,1000]之间的正整数,按从大到小顺序排序,并输出。
int a[99],i,j;
《C 语言》数组在排序算法中的应用 第 4 页 共 4 页
for (i=0 ;i<99;i++)
a[i]= (
);
for( i=0;i< 98;i++) for (j=i+1;j< 99;j++) if (
) {t= a[i];a[i]=a[j];a[j]=t;}
for (i=0 ;i<99;i++) printf(“\t%d”,a[i]);
五、总结 1、什么情况下要用数组的应用,利用数组的优点。 2、数组下标的控制,数组与循环变量的关系 3、比较法排序算法
六、知识的拓展 介绍其他的排序算法(选择法、冒泡法等)(用课件演示)
七、作业 1、用选择法对随机产生的 10 个[0,100]正整数进行升序排序。 2、用冒泡法对随机产生的 10 个(0,100)正整数进行降序排序。(提高)