第一篇:排序程序小结(冒泡排序、并归排序、插入排序等)(精)
程序在VC6.0下运行测试通过,包含三个文件:sort_all.h排序类的定义; sort_real.cpp排序类成员函数定义;sort_main.h运行的主函数。
包括冒泡排序、并归排序、插入排序、选择排序、快速排序、堆排序、Shell排序 ——————sort_all.h文件—————————————————— #include using namespace std;/****************************************/ class sort_all { public: void swap_i(int &a, int &b;void disp_array(int *array, int len;void disp_num(;void sort_maopao(int *array, int len;void sort_quick(int *array, int start, int end;void sort_merge(int * array, int start, int end;void sort_heap(int *array, int len;void sort_select(int *array, int len;void sort_insert(int *array, int len;void sort_shell(int *array, int len;};——————————————————————————————————————
————————sort_real.cpp文件——————————————————————
#include “sort_all.h”
void sort_all::disp_array(int *array, int len { for(int i=0;i { cout << array[i] << “ ”;} cout << endl;} void sort_all::swap_i(int &a, int &b { int temp;temp = a;a = b;b = temp;} void sort_all::disp_num({ cout << “---冒泡排序,输入1---” << “n”;cout << “---并归排序,输入2---” << “n”;cout << “---插入排序,输入3---” << “n”;cout << “---选择排序,输入4---” << “n”;cout << “---快速排序,输入5---” << “n”;cout << “----堆排序,输入6----” << “n”;cout << “--Shell排序,输入7---” << “n”;cout << “-----结束,输入0-----” << “n”;
} /**************************************************/ /**************堆排序 ******************************/ /**************************************************/ void heap_adj(int *array, int i, int len { int nTemp;int nChild;for(nTemp = array[i];2*i+1 { nChild = 2*i+1;if(nChild nChild ++;if(nChild < len-1 && array[nChild]>nTemp array[i] = array[nChild];else break;array[nChild] = nTemp;} } void heap_create(int *array, int len { for(int i=len/2;i>=0;i--heap_adj(array,i, len;}
void sort_all::sort_heap(int *array, int len { heap_create(array, len;for(int i=len-1;i>0;i--{ swap_i(array[0], array[i];heap_adj(array, 0, i;} } /*******************************************************/ /******************插入排序*****************************/ /*******************************************************/ void sort_all::sort_insert(int *array, int len { int i,j;int temp;for(i=1;i { temp = array[i];for(j=i;j>0 && array[j-1] > temp;j--array[j] = array[j-1];array[j] = temp;} } /********************************************************/
/*************冒泡排序***********************************/ /********************************************************/ void sort_all::sort_maopao(int *array, int len { int i,j;for(i=0;i { for(j=len-1;j>=i;j--{ if(array[j] > array[j+1] swap_i(array[j],array[j+1];} } } /**********************************************/ /**************并归排序************************/ /**********************************************/ void merge(int * array, int start, int mid, int end { int len_A = midmid;int *A = new int[len_A];int *B = new int[len_B];int i,j;for(i=0;i
A[i] = array[i +start];for(i=0;i B[i] = array[i + mid+1];i=0;j=0;int temp;int k=start;while(i { if(A[i] > B[j] { temp = A[i];i++;} else { temp = B[j];j++;} array[k++] = temp;} while(i { array[k++] = A[i++];}
while(j { array[k++] = B[j++];} } void sort_all::sort_merge(int * array, int start, int end { if(start == end return;else { int mid =(start+end/2;sort_merge(array, start, mid;sort_merge(array, mid+1, end;merge(array, start, mid, end;} } /********************快速排序******************************/ /**********************************************************/ void sort_all::sort_quick(int *array, int start, int end { int key = array[start];int i = start;int j = end;if(i>=j
return;while(i { while(i j--;array[i] = array[j];while(i = array[i] i++;array[j] = array[i];} array[i] = key;sort_quick(array, start, i-1;sort_quick(array, i+1, end;} /****************************************************/ /****************选择排序****************************/ /****************************************************/ void sort_all::sort_select(int *array, int len { int i,j;int ntemp;int key;for(i=0;i { key = array[i];
ntemp = i;for(j=i+1;j { if(array[j] < key && array[ntemp] > array[j] ntemp = j;} swap_i(array[i], array[ntemp];} } /*****************************************/ /**************** Shell排序****************/ /*****************************************/ void sort_all::sort_shell(int *array, int len { int step = len;int i;while(step >1 { step =(step+1/2;for(i=0;i { if(array[i+step] < array[i] swap_i(array[i+step], array[i];} }
} ————————————————————————————————————————————————————sort_main.cpp文件————————————————— #include “sort_all.h” int main({ int input[] = {2,4,5,1,5,8,10,-2,4};int len = sizeof(input/sizeof(int;int N;sort_all instance;while(1 { instance.disp_num(;cout << “请输入: ”;cin >> N;if(N==0 break;cout << “-” << “n”;cout<< “原始数据:” << “n”;instance.disp_array(input, len;switch(N { case 1: instance.sort_maopao(input, len;cout << “冒泡排序结果:” << “n”;
break;case 2: instance.sort_merge(input, 0, len-1;cout << “并归排序结果:” << “n”;break;case 3: instance.sort_insert(input, len;cout << “插入排序结果:” << “n”;break;case 4: instance.sort_select(input, len;cout << “选择排序结果:” << “n”;break;case 5: instance.sort_quick(input, 0, len-1;cout << “快速排序结果:” << “n”;break;case 6: instance.sort_heap(input, len;cout << “堆排序结果:” << “n”;break;case 7: instance.sort_shell(input, len;cout << “Shell排序结果:” << “n”;default:
break;} instance.disp_array(input, len;cout << “------” << “n”;cout << endl;} return 0;}
第二篇:冒泡排序教案
冒泡排序
信息技术 吕红波
教学内容分析
教材是教育科学出版社《算法与程序设计》,内容为第三章第四节第一部分《冒泡法排序算法》。排序算法是使用频率最高的算法之一,而冒泡排序是其中一种很典型而且相对简单的方法,这部分内容重点在于介绍冒泡排序的原理以及如何用程序实现冒泡排序算法,要求学生理解冒泡排序的过程的同时,能够运用冒泡排序算法解决实际问题。
教学对象分析
通过前面的学习,学生已经了解vb算法设计的基本知识,学会利用自然语言和流程图描述解决问题的算法,对排序中循环语句以及数组变量的使用方法都有了一定的基础。但由于程序设计思想比较弱,在实际生活中往往忽视运用排序算法来处理实际问题,这就要求学生通过本节课的学习,学会运用冒泡排序算法来处理实际问题,并为以后学习其它排序算法打下基础。
教学目标
1.知识与技能:
掌握冒泡排序的原理
理解冒泡排序的主要代码 2.过程与方法:
能够有效使用冒泡排序思想设计解决简单的排序问题 3.情感、态度与价值观:
提升分析问题、发现规律的能力 形成对排序算法探索的强烈愿望
教学重点、难点
教学重点:冒泡排序的过程和原理
教学难点:冒泡排序主程序代码的实现
教学方法
讲授法、活动型教学法、任务驱动教学法 教学过程
1.创设情景、激发兴趣
教师活动:出示2011-2012赛季NBA部分球员数据统计表。
提问:想知道谁的得分最高,谁的罚球最好,用什么方法? 学生活动:学生思考问题,给出可能性答案:excel排序和用程序设计实现。
2.图文并茂、理解过程
教师活动:运用程序设计中的冒泡排序算法可以实现。展示图片,讲解冒泡排序“冒泡”由来。
ppt展示任务:运用冒泡排序法将10,2,6,7,4从小到大进行排列。
结合ppt对冒泡排序实现过程进行讲解。
学生活动:结合教师讲解和ppt内容,理解冒泡排序原理。教师活动:播放一段关于冒泡排序的视频。
3.结合过程、书写代码
教师活动:讲解冒泡排序主程序部分,书写伪代码。学生活动:理解主程序。
4.总结归纳、学以致用
教师活动:组织学生开展活动:随机抽选五位男生、五位女生,按性别分组,用布遮住自己的眼睛,每组随机排成一队,要求队伍从左到右由高到矮排列,看哪组所用时间短。
提示:摸对方的头顶和自己比较的方式,结合冒泡排序来 完成。
归纳总结:什么是冒泡法排序?
在排序过程中,使小的数就像气泡一样逐层上浮,而使大的数逐个下沉。
拓展延伸:冒泡排序有不足之处。排序算法包括很多:插入排序、选择排序、快速排序、希尔排序等。
板书设计
冒泡法排序Visual Basic伪代码: For i=1 to 4
For j= 1 TO 5-i
If a(j)>a(j+1)THEN
交换a(j)和a(j+1)的值
End if
Next j Next i 学习效果评价
1.在教学实践过程中对学生操作效果和结论的及时反馈评价。2.完成本节课学习任务后,学生根据教学目标完成自我评价。
教学反思
本节课内容理论性比较强,通过多种方式来向学生呈现冒泡排序的过程,通过类比的方式让学生了解冒泡排序,通过一段有创意的舞蹈来进一步让学生了解冒泡排序的过程,避免了理论知识的枯燥,防止学生课内思维疲劳,让学生乐于去接受。最后通过一个简单的游戏让学生学以致用,来解决实际问题。通过教师的归纳总结让学生正确的看待冒泡排序算法。
第三篇:冒泡排序说课稿
冒泡排序说课稿
各位评委大家好,很高兴能给我十分钟的时间和大家交流。我叫周芮,来自09教技。今天我要说课的课题是《冒泡排序》。该课选自浙教版《算法与程序设计》。排序算法是本书中比较精彩但也是相对较难的部分之一,它的内容丰富,形式多样。而冒泡排序又是相对简单的一种排序方法。它是本章的第一课时,在本章中起着示范作用,所以讲好这节课是教好以后的课的关键。
综合以上几点,我将本课的教学目标制定如下: 知识与技能:
掌握冒泡排序的原理;
理解冒泡排序的流程图
过程与方法:
通过游戏中对人物财富的排序,理解冒泡排序的基
本原理和方法;
通过归纳冒泡排序算法来编写流程图
情感态度价值观:培养学生分析问题以及解决日常生活中实际问题的人能力,发现规律的能力。并激发学生主动学习的兴趣
基于对教材的理解,我将本堂课的重点定为掌握冒泡排序的算法,难点为归纳算法,用流程图表示。
我们现在面对的学生是所谓的90后,他们普遍具有创造性,容易接受新事物,善于发现的特点。他们对认知规律从感性逐步提升到了理性。而且学生有个普遍的特性就是爱玩,这是他们的天性。基于这一特点,我将会用游戏来引发他们的学习兴趣。在知识准备方面,学生
先前已经学过了算法的表示方法,三种基本结构,熟悉了变量的运用,能用算法描述一般问题的解决步骤。
在教法方面,我将选用演示法、任务驱动法、练习法。
在学法方面,主要是听讲法和自主探究学习法,通过老师讲解以及自己的亲身体验来探究算法的原理。
《师说》中提到,“师者,传到授业解惑也”,教学也就是为学生解决疑惑的。我的教学过程也就围绕“惑”这个字展开,我称之为“惑之四部曲”。
第一部曲是“遇惑”。我先创设一个游戏情境——大富翁,这是一款比较普遍的游戏,容易引起学生的共鸣,从而引发学生的学习兴趣。利用游戏中的一个情景——财富排行榜,来引出教学内容。首先我展示的排行榜上可能只有几个人,同学们能够很轻易地给出结果,可是当人数增多的时候,同学们就会觉得比较困难,当人数到达一定的数量后同学们会觉得这简直是不可能完成的任务。这样,老师就可以引出学习的内容——冒泡排序。
这一设计,我主要考虑到学生对数量少的数据能够比较容易地完成而不是通过考虑“按什么方法完成的”。这样增加难度后可以让学生体会到算法的好处,从而引起主动学习的兴趣,可以自然引出冒泡排序算法的思想。第二部曲是“析惑”。
为了让同学们脑海中模糊的思想变清晰,我准备了一个FLASH课件小游戏,内容就是大富翁的财富排行榜。我制定这么一个规则:将财富从少到多排列。可以通过从右往左的顺序两两进行对比,将较低的人往左排。
通过这样一个环节,可以让同学们比较直观的感受到冒泡算法的思想,是如何进行的。第三部曲是“解惑”
首先我会请同学用自然语言来描述算法的思想,我进行小结。接着我将继续提问如何用流程图表示。在这里我先会引入一个数组的概念,用板书演示。为了让同学更加透彻了解算法,我会用数组来演示详细的过程。用变量i表示趟值,用j表示带比较数组的位置。若d(j) 在课堂快结束时我将会进行课堂小结,回顾本堂课的知识点提问让同 学回答算法思想,达到巩固的目的。 最后一部曲是“扫惑”。我会给同学们布置一个任务,给出一张成绩单,上面印有一个同学的各科的考试成绩。让同学们用冒泡排序算法写出各趟排序结果并上交。这样可以及时检测同学们是否学会了。得到及时的反馈。 总结:因为这堂课相对而言是比较难的,如何长时间吸引学生的注意力是我要考虑的一个问题。为此,我进行了如下设计: 1、用游戏引入课堂,逐步加深问题的难度 2、用FLASH课件演示 3、用表格列举 4、请同学们补充流程图 数据结构——冒泡排序(第19讲,第9章) 一、复习回顾 什么是排序:排序是把一个无序的数据元素序列整理成有规律的按排序关键字递增(或递减)排列的有序序列的过程。 /************************************************(已经学过的排序方法有:直接插入排序、希尔排序、直接插入排序:顺序的把待排序序列中的各个记录按其关键字的大小,插入到已排序的序列的适当位置。 希尔排序:(缩小增量排序),不断把待排序的记录分成若干个小组,对同一组内的记录进行排序,在分组时,始终保持当前组内的记录个数超过前面分组排序时组内的记录个数。) ************************************************/ 二、第一小节(目标:理解掌握冒泡思想) 1、给出冒泡排序的定义(25分钟) 将待排序序列中第一个记录的关键字R1.key与第二个记录的关键字R2.key作比较,如果R1.key>R2.key,则交换记录R1和R2在序列中的位置,否则不交换;然后继续对当前序列中的第二个记录和第三个记录作同样的处理,依此类推,知道序列中倒数第二个记录和最后一个记录处理完为止,我们称这样的过程为一次冒泡排序。 2、请学生上台做排序练习(15分钟做题+10分钟讲解)(巩固排序思想的掌握) 第一题: 38 5 19 26 49 97 1 66 第一次排序结果:5 19 26 38 49 1 66 [97] 第二次排序结果:5 19 26 38 1 49 [66 97] 第三次排序结果:5 19 26 1 38 [49 66 97] 第四次排序结果:5 19 1 26 [38 49 66 97] 第五次排序结果:5 1 19 [26 38 49 66 97] 第六次排序结果:1 5 [19 26 38 49 66 97] 第七次排序结果:1 [5 19 26 38 49 66 97] 最后结果序列: 1 5 19 26 38 49 66 97 第二题: 8 7 6 5 4 3 2 1 数据结构——冒泡排序(第19讲,第9章) 答 第一次排序: 7 6 5 4 3 2 1 [8] 第二次排序: 6 5 4 3 2 1 [7 8] 第三次排序: 5 4 3 2 1 [6 7 8] 第四次排序: 4 3 2 1 [5 6 7 8] 第五次排序: 3 2 1 [4 5 6 7 8] 第六次排序: 2 1 [3 4 5 6 7 8] 第七次排序: 1 [2 3 4 5 6 7 8] 最后结果序列: 1 2 3 4 5 6 7 8 第二题: 1 2 3 4 5 6 7 8 第一次排序: 1 2 3 4 5 6 7 [8] 第二次排序: 1 2 3 4 5 6 [7 8] 第三次排序: 1 2 3 4 5 [6 7 8] 第四次排序: 1 2 3 4 [5 6 7 8] 第五次排序: 1 2 3 [4 5 6 7 8] 第六次排序: 1 2 [3 4 5 6 7 8] 第七次排序: 1 [2 3 4 5 6 7 8] 最后结果序列: 1 2 3 4 5 6 7 8] 从练习题中引出:一次冒泡排序的结果:使关键字最大的记录排在了序列的最后一个位置上。(这很重要,要强调) 比较后两题的题目区别和排序过程区别,作为课间思考题。(第二题是一组逆序数据,每一个排序都进行了数据交换,共进行了8-1=7次冒泡;第三题是一组正序数据,进行完一次排序后就发现,没有任何数据交换发生,后面进行的第二次到第七次冒泡的过程完全一样。) 三、第二小节 3、冒泡排序终止的条件(20分钟) 课堂思考题:考虑任何一组序列最多进行多少次冒泡排序就可保证顺序一定已经排好了。 思考:如果序列初始顺序是逆序,需要进行多少次排序(要记住,数据结构——冒泡排序(第19讲,第9章) 每次冒泡排序的结果:可以保证最大的记录在最后一个位置上)。如果序列初始顺序是正序,需要进行多少次排序就可以保证数据序列顺序。如何使排序过程适可而止?既排好序又不多余进行? 当计算机对一组数据进行排序之前,并不知道该组数据是什么顺序,因此,必须要进行至少一次的比较和排序,当某一比较和排序进行完之后发现没有任何数据交换发生,证明任何相邻的两数都符合目标顺序要求,因此,也不必再进行下一下比较排序了。 结论:当进行某次冒泡排序时,若没有任何两个记录交换位置,则表明序列已排好,此时排序可结束。 4、用文字(伪码)描述冒泡排序算法(15分钟)思考方法: 首先是对数组的相邻的两数比较,根据比较结果确定是否交换位置;这种比较进行的次数比数据列中数据个数少1; (此两步完成了一次冒泡排序) 对一个序列来说,共进行多少次冒泡排序呢?最多和上面第二步的比较次数一样,但也可提前结束,只要在某一遍冒泡中没有发生数据交换即可。如何确实是否发生数据交换,在程序中,可以考虑设置一个标志位,当发生数据交换时,更改标志位,每次重新进行冒泡排序之前可以检查标志位,如果没有发生改变,则可证明上一次冒泡已经没有数据交换发生,也就是说数据序列已经排好,可以停止进行冒泡排序。 冒泡算法函数 { 设置标志位; //以下循环用来控制冒泡排序进行的次数 数据结构——冒泡排序(第19讲,第9章) for循环(对n个数据的序列进行n-1次冒泡,但是如果没有交换发生则跳出该循环){ //以下循环用来对该数据序列进行一次冒泡排序 for(单次冒泡排序需要进行n-1次){ 比较相邻两数的大小; if(前大后小){ 交换 } else //前小后大 { 位置不变 } } } } 5、回顾总结冒泡排序的思想(10分钟)本节课: 1.首先回顾了什么是排序; 2.然后介绍了冒泡排序的思想;(每次冒一个泡泡,把最大的冒到最后)3.我们通过三道练习题对一组无序数据进行了排序; 4.通过练习题我们看出来,数据初始序列越接近目标序列,冒泡的次数越少;因此我们总结出了冒泡排序最多进行的次数和终止的条件; 5.最后,我们根据冒泡排序的思想用文字描述了冒泡函数的构成方法; 四、课后作业 1、用冒泡排序法对数字序列进行排序(要写出6次排序步骤) 55 48 37 10 90 84 答 55 48 37 10 60 84 90 48 37 10 55 60 84 90 37 10 48 55 60 84 90 10 37 48 55 60 84 90 数据结构——冒泡排序(第19讲,第9章) 10 37 48 55 60 84 90 2、用C语言描述冒泡排序算法。 Void BubbleSort(elemtype x[],int n)//传入序列和序列数字个数 { int i,j,flag=1;elemtype temp;for(i=1;i /*选择排序*/ public class SelectSort2 { public static void sort(int[] tempArr){ for(int i =0;i { /* 当初错误认为此处与冒泡排序极为相像,甚至觉得选择排序与冒泡排序毫无差别,其实相反,冒泡循环意味着每一次 循环都会将相邻的两个数比较这样每次都会排出数组中最大或最小的数。然后再次执行外层循环,再继续进入内层循环 再依次进行比较。 选择排序则是,第一次循环:咬定第一个数角标i=0的元素,依次与后面的元素比较,将最小或最大的数排出来,再进入 外层的第二次循环,并且此时咬定的数为角标为1的元素,但因为之前已将全数组中最小或最大的数排出所以没有必要再 与数组中角标为零得数比较 而是通过 j=i+1 将待比较的角标变成[ 2、3、...、tempArr.length)。 */ for(int j =i+1;j { if(tempArr[i]>tempArr[j]) { int temp = tempArr[i]; tempArr[i] = tempArr[j]; tempArr[j] = temp; } } } } public static void arrPrint(int[] tempArr){ System.out.print(“[”); for(int i = 0;i { if(i!= tempArr.length-1) { System.out.print(tempArr[i]+“,”); } else { System.out.println(tempArr[i]+“]”); } } } public static void main(String args[]){ int[] arr = new int[]{10,2,-7,8,1,12,6,7,9,3};arrPrint(arr);sort(arr);arrPrint(arr);} } /*冒泡排序*/ public class MpSort2 { public static void sort(int[] tempArr){ for(int i = 0;i { for(int j = 0;j { if(tempArr[j]>tempArr[j+1]) { int temp = tempArr[j]; tempArr[j] = tempArr[j+1]; tempArr[j+1] = temp; } } } } public static void arrPrint(int[] tempArr){ System.out.print(“[”); for(int i = 0;i { if(i!= tempArr.length-1) { System.out.print(tempArr[i]+“,”); } else { System.out.println(tempArr[i]+“]”); } } } public static void main(String[] args){ int[] arr = new int[]{10,2,-7,8,1,12,6,7,9,3}; arrPrint(arr); sort(arr); arrPrint(arr);} }第四篇:冒泡排序法教案
第五篇:冒泡排序及选择排序Java实现心得