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

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

开发者学堂课程【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趟。

相关文章
|
6月前
|
存储 人工智能 算法
深入浅出堆排序: 高效算法背后的原理与性能
深入浅出堆排序: 高效算法背后的原理与性能
114 1
|
机器学习/深度学习 算法 搜索推荐
重点算法排序之堆排序(下篇)
我们已经讲述了快速排序和归并排序,快速排序和归并排序详解文章链接:重点算法排序之快速排序、归并排序(上篇),我们本篇文章来详细讲述以下堆排序。堆排序的主要内容有:最大堆(大顶堆)、最小堆(小顶堆)、通过孩子找父亲、通过父亲找孩子、向下调整算法建堆。下面我会给大家一一介绍。
51 0
算法:图解递归算法的应用场景和使用途径
算法:图解递归算法的应用场景和使用途径
|
3月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
41 0
|
4月前
|
搜索推荐 算法 C++
|
SQL 前端开发 安全
难点理解&面试题问答
难点理解&面试题问答
|
算法
面试题思路分享以及延伸问题探讨三
让我们紧接上文 单链表面试题分享二 ,这篇文章只给大家分享三道题.它们分别是:1.环形链表初阶 力扣141题-----2.环形链表进阶 力扣142题----- 3.复制带随机指针的链表 力扣138题 .值得注意的是这三道题的技巧性很强,是属于能想到方法实现起来很简单,想不到方法实现起来很复杂甚至不能实现的题.这里我提供给大家的思想和方法可能是我们之前出来没有遇见过也不好想到的方法,证明了这个地方我们已经开始上难度了,开始真正的在"玩"链表了.
|
前端开发
前端学习案例1-选择排序
前端学习案例1-选择排序
37 0
前端学习案例1-选择排序
|
算法 搜索推荐
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
196 0
《十大排序算法》让你的思维流动起来。今天的主角又是排序思想你了解多少。每种算法的内容在代码中体现出来。
算法提炼--冒泡排序的理解(12.4)
算法提炼--冒泡排序的理解(12.4)