数据结构-冒泡排序教案
- 格式:doc
- 大小:63.00 KB
- 文档页数:5
冒泡排序教案
教学目的
1. 知识与技能:
1)了解排序及冒泡排序的概念及特点;
2)掌握冒泡法排序的原理;
3)掌握冒泡法排序的优化;
4)初步掌握冒泡排序的程序实现。
2.过程与方法:
理解冒泡排序的分析过程,并初步掌握用冒泡排序算法来设计解决简单的排序问题。
3. 课时分配:1课时
教学重点
冒泡排序算法的原理。
教学难点
分析冒泡排序的实现过程。
教学方法
讲授法、示例法与练习法结合。
教学用具
板书
教学过程
一、复习回顾
什么是排序:排序是把一个无序的数据元素序列整理成有规律的按排序关键字递增(或
递减)排列的有序序列的过程。
排序过程的两种基本操作:(1)比较两个关键字的大小(2)将记录从一个位置移动到另一
个位置。
二、冒泡排序
1、冒泡排序(bubble sort)的概念
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访要排序的数列,一次比较
两个元素,如果他们的顺序错误就把他们交换过来。走访序列的工作是重复地进行直到没有
需要交换的数据,也就是说该序列已经排序完成。这个算法的名字由来是因为越小的元素会
经由交换慢慢“浮”到序列的顶端。
2、冒泡排序的思想
将待排序序列中第一个记录的关键字R1.key与第二个记录的关键字R2.key作比较,如
果R1.key>R2.key,则交换记录R1和R2在序列中的位置,否则不交换;然后继续对当前序
列中的第二个记录和第三个记录作同样的处理,依此类推,直到序列中第n-1个和第n个记
录处理完为止,我们称这样的过程为第一趟起泡排序,其结果使得关键字最大的记录被安置
到最后一个记录的位置上。然后进行第二趟起泡排序对前n-1个记录进行同样的操作,其结
果是使关键字次大的记录被安置到第n-1个记录的位置上。然后进行第三、四……趟起泡排
序,直到排序完成。
同时用流程图的方式板书其思想,流程图如下图所示:
开始
N个数据的序列a[n]
定义变量并赋值i,j,temp
i
j
Y
a[j]>a[j+1]
Y
利用temp交换a[j]、a[j+1]的值
j=j+1
N
I=i+1
结束
N
3、课堂示例
第一题: 97 66 49 38 26 17 9 6
第一趟排序结果:66 49 38 26 17 9 6 [97]
第二趟排序结果:49 38 26 17 9 6 [66 97]
第三趟排序结果:38 26 17 9 6 [49 66 97]
第四趟排序结果:26 17 9 6 [38 49 66 97]
第五趟排序结果:17 9 6 [26 38 49 66 97]
第六趟排序结果:9 6 [17 26 38 49 66 97]
第七趟排序结果:6 [9 17 26 38 49 66 97]
最后结果序列: 6 9 17 26 38 49 66 97
第二题: 6 9 17 26 38 49 66 97
第一趟排序结果:6 9 17 26 38 49 66 [97]
第二趟排序结果:6 9 17 26 38 49 [66 97]
第三趟排序结果:6 9 17 26 38 [49 66 97]
第四趟排序结果:6 9 17 26 [38 49 66 97]
第五趟排序结果:6 9 17 [26 38 49 66 97]
第六趟排序结果:6 9 [17 26 38 49 66 97]
第七趟排序结果:6 [9 17 26 38 49 66 97]
最后结果序列: 6 9 17 26 38 49 66 97
4、由练习引出
(1)、一次冒泡排序的结果:使关键字最大的记录排在了序列的最后一个位置上。(很重要)
(2)、冒泡排序的特点:第一,.“编程复杂度”很低,很容易写出代码;第二,具有稳定性,
这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,
(3)、比较两题的题目区别和排序过程区别。
第一题是一组逆序数据,每一趟排序都进行了数据交换,共进行了8-1=7次冒泡;第二
题是一组正序数据,进行完一次排序后就发现,没有任何数据交换发生,后面进行的第二次
到第七次冒泡的过程完全一样。
三、冒泡排序的优化
课堂思考题:考虑任何一组序列最多进行多少次冒泡排序就可保证顺序已经排好了。
思考:如果序列初始顺序是逆序,需要进行多少次排序?如果序列初始顺序是正序,需
要进行多少次排序就可以保证数据序列顺序?如何使排序过程适可而止,既排好序又不多余
进行?
当计算机对一组数据进行排序之前,并不知道该组数据是什么顺序,因此,必须要进行
至少一次的比较和排序,当某一比较和排序进行完之后发现没有任何数据交换发生,证明任
何相邻的两数都符合目标顺序要求,因此,也不必再进行下一次比较排序了。
结论:当进行某次冒泡排序时,若没有任何两个记录交换位置,则表明序列已排好,此
时排序可结束。
四、用文字描述冒泡排序算法
思考方法:
首先是对数组的相邻的两数比较,根据比较结果确定是否交换位置;这种比较进行的次
数比数据列中数据个数少1;(此两步完成了一次冒泡排序)
对一个序列来说,共进行多少次冒泡排序呢?最多和上面第二步的比较次数一样,但也
可提前结束,只要在某一遍冒泡中没有发生数据交换即可。如何确定是否发生数据交换,在
程序中,可以考虑设置一个标志位,当发生数据交换时,更改标志位,每次重新进行冒泡排
序之前可以检查标志位,如果没有发生改变,则可证明上一次冒泡已经没有数据交换发生,
也就是说数据序列已经排好,可以停止进行冒泡排序。
冒泡算法函数{
设置标志位;
//以下循环用来控制冒泡排序进行的次数
for循环(对n个数据的序列进行n-1次冒泡,但是如果没有交换发生则跳出该循环)
{
设置标志位值;
//以下循环用来对该数据序列进行一次冒泡排序
for(单次冒泡排序需要进行n-i-1次)
{
比较相邻两数的大小;
if(前大后小)
{
交换
改变标志位
}else //前小后大
{
位置不变
}
}
}
}
总结
本节课:
1. 首先回顾了什么是排序;
2. 然后介绍了冒泡排序的思想;(每次冒一个泡泡,把最大的冒到最后)
3. 通过三道练习题对一组无序数据进行了排序;
4. 通过练习题我们看出来,数据初始序列越接近目标序列,冒泡的次数越少;因此我们总
结出了冒泡排序最多进行的次数和终止的条件;
5. 最后,我们根据冒泡排序的思想用文字描述了冒泡函数的构成方法。
作业
1、用冒泡排序法对数字序列进行排序(要写出6次排序步骤)
60 55 48 37 10 97 74
答 55 48 37 10 60 74 97
48 37 10 55 60 74 97
37 10 48 55 60 74 97
10 37 48 55 60 74 97
10 37 48 55 60 74 97
10 37 48 55 60 74 97
2、用C语言描述冒泡排序算法。
Void BubbleSort(int x[],int n) //传入序列和序列数字个数
{
Int i =0;
int j =0;
int flag =1;
int temp;
for(i=0;i
flag=0;
for(j=0;j
if(x[j]> x[j+1])
{
flag=1;
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
}
}
}
}