冒泡排序(难点非重点) | 学习笔记

简介: 快速学习 冒泡排序(难点非重点)

开发者学堂课程【Python入门 2020年版冒泡排序(难点非重点)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/639/detail/10297


冒泡排序(难点非重点)


内容介绍

一、图例讲解

二、思路讲解(11-冒泡排序)

三、代码实现(11-冒泡排序)

四、优化相关

五、总结


一、图例讲解

1.第一趟

冒泡排序属于难点但非重点,目的是为了培养大家编程思维。

如图,获得一组无序数据6 5 3 1 8 7 2 4,此时要将其变成一组有序数据,排序方法繁多,其中冒泡排序空间复杂度较大,其中心思想:让一个数字和它相邻的下一个数字进行比较运算,如果前一个数字大于后一个数字,交换两个数据的位置。

1.png

第一次排序,65两个数进行比较,根据如果前一个数字大于后一个数字,交换两个数据的位置。其中65大,所以交换两者位置。

6下标变为1

1.png

1.png

下标01两数比较完成之后,6和相邻的3再次比较,63大,交换两者位置。6下标变为2

1.png

1.png

之后,6再和1进行比较,6大于1故两者交换位置,6下标变为3

1.png

1.png

最后直到68进行比较,前一个数6不大于后一个数8,因而6不再变化。8再继续和下一个数7进行比较,显然前一个数8大于后一个数7,两者交换位置,因而此时6下标为3,不再进行比较。8下标为5

1.png

1.png

8继续和2进行比较,前一个树8大于后一个数2,两者交换位置,8下标为6

1.png

1.png

最后,前一个数8与后一个数4比较,8大于4,两者交换。8最后下标为7。比较完成之后我们可以发现,最大的数移至最后。

1.png

2.总结:

冒泡排序的精髓就是,前一个数与后一个数相比,大的数向后移(冒泡),不断重复此步骤,直至排序成功。


二、思路讲解(11-冒泡排序)

1.确定内部循环次数

nums = [6,5,3,1,872,4]

#冒泡排序思想:

#让一个数字和它相邻的下一个数字进行比较运算

#如果前一个数字大于后一个数字,交换两个数据的位置

#nums[0]  nums [1]

#nums[ 1]  nums[2] //图例所表达的代码思想好比 nums 的第一个数和第二个数比较,第二个数再和第三个数比较,比较完成假设第一个数大于第二个数就交换位置。

……       ……

#n的取值应该是 length-2

#nums[ n]   nums[n+ 1]

#……        ……

#最后一次比较,length 表示长度

nums[ length - 2]  nums[leng - 1]

#该次比较没有意义,直到 length-1就是最后一次比较

#nums[ length - 1]   nums[length]

总结:

nums[ length - 1] nums[length]之间不必比较,n 的取值到 length-2即可,因为 n length -1时所对应的就是最后一个数

nums[ length - 2]  nums[leng - 1]对应的就是 nums 里的24

2.判断是否完成相邻两数互相比较

nums = [6,5,3,1,8,7,2,4]

n = 0

//lennums)表示 nums 的长度 While n<nums 的长度-1n length-2,注意并非-2,小于表示取不到值,len(nums) - 2时,n 取不到 len(nums) - 2

while n <len(nums) - 1:

print(nums[n],nums(n + 1))

n += 1

输出结果:

//由输出结果可以知道上述代码完成相邻两数互相比较

6 5//n=0 n=1进行比较

5 3 //n=1 n=2进行比较

3 1 //之后依次比较

1 8

8 7

7 2

2 4

3.第一趟排序代码实现

nums = [6,5,3,1,872,4]

n = 0

while n <len(nums) - 1:

if nums [n] > nums [n+1] //如果前一个数据大于后一个数据

nums[n]nums[n + 1] = nums[n + 1] , nums[n]//交换位置

n += 1

print(nums)

输出结果:

[5,3167248]  //结果与第一趟比较结果相同


三、代码实现(11-冒泡排序)

1.png

但此时认为变成有序排列,根据第一趟排序的思想,只需要不断重复循环排列数据的操作,即可变成有序。但一次次重复书写太过繁琐,因而再加上一层外部循环即可。

1.多个单次循环--淘汰版

nums = [6,5,3,1,872,4]

while n <len(nums) - 1:

if nums [n] > nums [n+1] //如果前一个数据大于后一个数据

nums[n]nums[n + 1] = nums[n + 1] , nums[n]//交换位置

n += 1

print(nums)

while n <len(nums) - 1:

if nums [n] > nums [n+1]//如果前一个数据大于后一个数据

nums[n]nums[n + 1] = nums[n + 1] , nums[n]//交换位置

n += 1

print(nums)

while n <len(nums) - 1:

if nums [n] > nums [n+1]//如果前一个数据大于后一个数据

nums[n]nums[n + 1] = nums[n + 1] , nums[n]//交换位置

n += 1

print(nums)

…………………………

输出结果:

[53167248]

[31,562478]

[1,3524678]

2.冒泡排序--最终代码

在此最佳循环次数7次即可,因为共有8个数字,每次比较都会得到当前数字更大的数,循环7次后,就会拿到7个最大数字,剩下的就是最小的数,不必再做比较。

nums = [65318724]

i = 0

While i < len(nums) - 1:

i+=1

n=0

while n <len(nums) - 1:

if nums [n] > nums [n+1]//如果前一个数据大于后一个数据

nums[n]nums[n + 1] = nums[n + 1] , nums[n]

//交换位置

n += 1

print(nums)

输出结果:

[53167248]  //拿出最大数8

[31562478]  //拿出最大数7

[13524678]  //拿出最大数6

[13245678]  //拿出最大数5

[12345678]  //拿出最大数4

[12345678]  //拿出最大数3

[1,2345678]  //拿出最大数2


四、优化相关

1.每一趟比较次数的优化

在第二趟的比较之中,7和之前的数一一比较,知道与最后与8比较时,其实并没有必要,因为在第一趟就已经定下了8的位置。但我们的代码每次都做了重复的比较。

1.png

2.总比较趟数的优化

同时在第五趟比较完成后,此时数组就已经是有序排列,同时在第六趟中并不存在任何的数据交换,但第七趟还在不停的做重复的比较排序。由此存在优化的地方。

1.png

1.png

3.解决方法

(1)将内部循环的 while n<len(nums) - 1变为 while n<len(nums) - 1+i

(2)可以设置标识符,发现没有交换时就停止。

4.类似于矩阵乘法表

i = 0

While i < len(nums) - 1:

i+=0

n=0

while n <len(nums) - 1:

n += 1

print(‘*’,end=’ ’)

print()

输出结果:

1.png

5.  九九乘法表(倒)

i = 0

While i < len(nums) - 1:

i+=0

n=0

while n <len(nums) - 1-i://加上减i就变成了倒的99乘法表

n += 1

print(‘*’,end=’ ’)

print()

输出结果:

1.png


五、总结:

冒泡排序的内层是将一个数和下一个数进行比较,即 nums[n]nums[n+1]进行比较,如果前一个大于后一个,交换位置。同时不止比较一趟,每一趟比较都会找到一个最大数,所以要比较 len(nums)-1趟。8个数比较7趟,10个数比较9趟。

相关文章
|
缓存 Java
认真阅读完这篇文章熟练掌握阿里巴巴规范创建Java线程池
认真阅读完这篇文章熟练掌握阿里巴巴规范创建Java线程池
985 0
|
存储 Java 程序员
|
前端开发 JavaScript API
探索现代前端框架——React 的性能优化策略
探索现代前端框架——React 的性能优化策略
389 0
|
算法 程序员
程序员必知:XGB算法梳理
程序员必知:XGB算法梳理
298 0
|
开发者
开发项目小问题总结,带有详解解释,让自己的代码走向完美之路,持续更新
这篇文章总结了开发项目中遇到的小问题及解决方案,包括字符串比较、资源管理、代码优化、异常处理等方面的内容,旨在帮助开发者写出更规范、高质量的代码。
152 2
开发项目小问题总结,带有详解解释,让自己的代码走向完美之路,持续更新
|
设计模式 监控 安全
Java并发编程详解-知识点梳理
Java并发编程详解-知识点梳理
230 2
|
SQL JSON 前端开发
【知识点梳理】
【知识点梳理】
|
存储 Kubernetes API
1.Kustz 简介和思路
1.Kustz 简介和思路
|
C++
c++零散知识点
如果在类体外定义inline函数,则必须讲类定义和成员函数定义都放在同一个头文件里面(或写在同一个源程序文件中)否则编译时无法进行置换(将函数代码得拷贝嵌入到函数调用点中)
235 0
|
编译器 C语言 C++
C/C++零散知识点汇总
C/C++零散知识点汇总