C++编程《第17课 冒泡排序与插入排序》教学课件.pptxVIP

  • 1
  • 0
  • 约5.39千字
  • 约 28页
  • 2026-03-10 发布于广西
  • 举报

C++编程《第17课 冒泡排序与插入排序》教学课件.pptx

第17课冒泡排序与

插入排序

学习目标1、理解并掌握冒泡排序基本原理3、掌握冒泡排序与插入排序的基本使用2、理解并掌握插入排序基本原理

知识讲授

冒泡排序冒泡排序(BubbleSort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有元素再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换像气泡一样慢慢“浮”到数列的顶端。

冒泡排序规则每次比较相邻的元素,如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。经过一轮排序后,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每轮对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较,也就是已经是按照从小到大的顺序排列了。接下来我们以五个数字从小到大排序来演示冒泡排序的具体过程。

冒泡排序过程演示前面比后面大,交换前面比后面大,交换前面比后面大,交换第1次第2次第3次第4次第1次第2次第3次第1次第2次第1次1235991876第1轮需要4次比较第2轮需要3次比较第3轮需要2次比较第4轮需要1次比较一共有5个数,x,y表示第x个数和第y个数作比较。第一轮:比较4次1,22,33,44,5第二轮:比较3次1,22,33,4第三轮:比较2次1,22,3第四轮:比较1次1,2第一轮可以确定最大的数99第二轮可以确定次大的数76第三轮可以确定第三大的数35第四轮可以确定第四大的数18第五轮无需比较可以确定最小的数12

冒泡排序规律通过刚才的例子,我们应该发现了如下规律:每轮比较都会确定一个数字的位置,因此N个数字需要比较N-1轮。刚才5个数比较,第一轮比较了4次,第二轮比较3次,第三轮比较2次,第四轮比较1次,那么第i轮比较的次数为N-i次。每次比较均是对相邻两个数字作比较,直至最后。

参考代码#includeiostreamusingnamespacestd;intmain(){intn;inta[200];cinn;for(inti=1;i=n;i++)cina[i];for(inti=1;i=n-1;i++)//冒泡比较多少轮for(intj=1;j=n-i;j++)//第i轮比较n-i次;if(a[j]a[j+1])swap(a[j],a[j+1]);//只比较和交换相邻位置;for(inti=1;i=n;i++)couta[i];return0;}如果想从大到小排序,则把if(a[j]a[j+1])改成if(a[j]a[j+1]),让小的“冒泡”。

冒泡排序优化刚才对于序列{12,35,99,18,76}的排序过程中,我们不难发现,第二轮排序进行完之后,整个序列已经是有序的了,也就是说第二轮排序结束就可以不用接着进行接下来的比较了。因此我们可以对刚才的程序进行优化,那么什么时候就可以结束排序过程呢?根据观察,我们发现当某轮排序过程中没有交换的发生,那么就说明序列已经有序,无需再次比较了。

参考代码#includeiostreamusingnamespacestd;intmain(){intn;inta[200];cinn;for(inti=1;i=n;i++)cina[i];for(inti=1;i=n-1;i++){boolflag=0;//flag标记是否有交换 for(intj=1;j=n-i;j++){ if(a[j]a[j+1]){flag=1;//有交换发生则标记为1swap(a[j],a[j+1]);} } if(flag==0)break;//没有交换直接结束排序}for(inti=1;i=n;i++)couta[i];return0;}

课堂练习

【描述】给定一个长度为n(1=n=10000)的序列,问该序列中第k(1=k=n)小的元素是多少?用冒泡排序完成程序。【输入】输入共2行,第1行是n和k。后面1行是n个整数;【输出】1个数字。第k小的元素。【样例输入】32362【样例输出】3第k小的元素

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档