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

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

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

相关文章
|
7月前
|
机器学习/深度学习 算法 搜索推荐
重点算法排序之堆排序(下篇)
我们已经讲述了快速排序和归并排序,快速排序和归并排序详解文章链接:重点算法排序之快速排序、归并排序(上篇),我们本篇文章来详细讲述以下堆排序。堆排序的主要内容有:最大堆(大顶堆)、最小堆(小顶堆)、通过孩子找父亲、通过父亲找孩子、向下调整算法建堆。下面我会给大家一一介绍。
30 0
|
7月前
|
算法
算法:图解递归算法的应用场景和使用途径
算法:图解递归算法的应用场景和使用途径
|
算法
贪心算法入门典型案例
在N行M列的正整数矩阵中,要求从每行中选出1个数,使得选出的总共N个数的和最大。输入:第一行两个正整数N和M,用空格隔开,表示行数和列数 第2行到第N+1行,每行M个用空格隔开的整数 ,表示矩阵 输出最大总和 1 #include 2 #include 3 #include 4 5 ...
1049 0
|
5月前
|
算法 搜索推荐 程序员
【十大排序】带你深入分析快速排序
【十大排序】带你深入分析快速排序
|
7月前
|
Cloud Native Go
面试中的行为考察:展示你的人际交往能力
面试中的行为考察:展示你的人际交往能力
39 0
|
8月前
|
SQL 前端开发 安全
难点理解&面试题问答
难点理解&面试题问答
|
11月前
|
机器学习/深度学习 数据可视化 数据挖掘
RNAseq纯生信挖掘思路分享?不,主要是送你代码!(建议收藏)
RNAseq纯生信挖掘思路分享?不,主要是送你代码!(建议收藏)
205 0
|
11月前
|
算法
面试题思路分享以及延伸问题探讨三
让我们紧接上文 单链表面试题分享二 ,这篇文章只给大家分享三道题.它们分别是:1.环形链表初阶 力扣141题-----2.环形链表进阶 力扣142题----- 3.复制带随机指针的链表 力扣138题 .值得注意的是这三道题的技巧性很强,是属于能想到方法实现起来很简单,想不到方法实现起来很复杂甚至不能实现的题.这里我提供给大家的思想和方法可能是我们之前出来没有遇见过也不好想到的方法,证明了这个地方我们已经开始上难度了,开始真正的在"玩"链表了.
算法提炼--冒泡排序的理解(12.4)
算法提炼--冒泡排序的理解(12.4)
|
前端开发
前端学习案例1-选择排序
前端学习案例1-选择排序
28 0
前端学习案例1-选择排序