课程首页 › 第4部分 › 第66课

第66课 经典之冒泡排序

第4部分 点、线、面、立体的组合 · 数组· 知识点:数组、冒泡排序

经典之冒泡排序(数组、冒泡排序)

插图

回味经典,我们一起来探索冒泡排序。说到冒泡你一定见过,喝汽水的时候,汽水中常常会有许多小小的气泡,缓缓地从瓶底浮到水面。“冒泡排序”也因此得名,在排序过程中,较大(或较小)的元素会像气泡一样逐渐浮到数组的一端。

我们的任务是运用冒泡排序的方法将数组int arr[15]={23,45,12,24,67,16,8,98,54,43,46,45,109,68,86}按照从小到大的顺序排列。

核心思想

每种排序方法都有它自己的核心思想,只要掌握了核心思想,按照规则实现程序就可以了。

冒泡排序的核心思想:

依次将两两相邻的数字进行比较,将大数或小数放到一端。

冒泡排序的基本操作:

(1)按顺序比较两两相邻的元素。

(2)根据大小需求交换元素位置。

冒泡排序法的推演

来吧,试试对这样一组数字9、5、8、6、3进行冒泡排序,使得数字从小到大排列。

小数在前大数在后,将大数往后移动。

1.第一轮开始

(1)第一波比较相邻数字9和5。

插图

(2)第二波比较相邻数字9和8。

插图

(3)第三波比较相邻数字9和6。

插图

(4)第四波比较相邻数字9和3。

插图

(5)这5个数字,经过4波比较,将最大数字9找出来并且放到了最后。

插图

2.第二轮开始,从头来,这是要找第二大的数字了

(1)第一波比较相邻数字5和8。

插图

(2)第二波比较相邻数字8和6。

插图

(3)第三波比较相邻数字8和3。

插图

(4)这一轮共4个数字,经过3波比较,找出了第二大数字8放到了后面。

插图

3.第三轮开始,从头来,找出第三大数字

(1)第一波比较相邻数字5和6。

插图

(2)第二波比较相邻数字6和3。

插图

(3)这一轮有3个数字,经过了2波比较,找出了6。

4.第四轮开始

2个数字,一轮比较

插图

最终排序成功→3、5、6、8、9。

插图

敲黑板

关键来啦,到底需要几轮比较,每一轮到底需要比较几波?

一起来总结和思考:

(1)5个数字,第一轮比较找出了9并且放到了最右端。按照冒泡排序的核心思想,每轮比较我们都找出了剩余数字中最大的数字并放到了最右边。

(3)每一轮又进行了多少波的比较呢?5个数字需要4波比较。每一轮比较的波数比参与比较的数字的数量少1。

程序逻辑

来吧,根据总结和思考以及冒泡排序的基本操作,我们编写代码。

假设有n个数字进行排序,组合成数组arr[n]。

插图

(2)每轮需要多少波比较呢?

比较波数比参与比较的数字的数量少1,于是需要知道参与比较数字的数量。我们知道每一轮比较可以确定一个数字,那么i轮比较也就确定了i个数字,意味着剩余数量为n-i个。

然后波数再比剩余数量还少1,所以需要n-i-1波。这是内层循环。

插图

(3)根据数字大小进行位置交换,这就回到之前学习过的互换。

插图

尝试编写冒泡排序的程序吧!对比排序前和排序后数字顺序的变化。

插图

运行程序:

排序前:23 45 12 24 67 16 8 98 54 43 46 45 109 68 86

排序后:8 12 16 23 24 43 45 45 46 54 67 68 86 98 109

敲黑板

冒泡排序3大要点:

(1)确定外循环次数,也就是需要几轮比较→参与排序的数字的数量- 1。

(3)根据排序的大小要求,决定if条件和交换顺序。

注意

程序中使用了arr[j+1],很有可能会导致数组越界。

巩固练习

(1)根据课程中讲述的冒泡排序程序,数组{2,4,8,3,6,1}外循环完成一轮后,该数组会变成什么样子?()

A.2,4,8,3,6,1

B.2,4,3,6,1,8

C.1,2,3,4,6,8

D.4,8,3,6,2,1

(2)完善以下程序,使得数字9,4,5,8,2,4,10,5,6,9从小到大排序。

//冒泡排序

for(int i=0;i<_________;i++){
for(int j=0;j<__________;j++){
if(arr[j]>arr[j+1]){

temp=arr[j+1]; arr[j+1]=arr[j]; arr[j]=temp;}

(3)编写一个C++程序,输入10个考试成绩得分(0~100),将成绩由大到小排序输出。

输入:

输入10个成绩得分,成绩之间用空格隔开。

输出:

按照由大到小的顺序输出成绩。

样例输入:

样例输出: