Python学习的自我理解和想法(28)

简介: 本文记录了学习Python第28天的内容——冒泡排序。通过B站千锋教育课程学习,非原创代码。文章详细介绍了冒泡排序的起源、概念、工作原理及多种Python实现方式(普通版、进阶版1和进阶版2)。同时分析了其时间复杂度(最坏、最好、平均情况)与空间复杂度,并探讨了实际应用场景(如小规模数据排序、教学示例)及局限性(如效率低下、不适用于高实时性场景)。最后总结了冒泡排序的意义及其对初学者的重要性。

学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码!

今天是学Python的第28天,学的内容是冒泡排序。这是前面漏的一个知识点,开学了,时间不多,写得不多,见谅。

目录

1.冒泡排序简述

2.冒泡排序的起源与概念

3.冒泡排序的详细工作原理

4.Python 实现冒泡排序的多种方式

(1).普通版

(2).进阶版1

(3).进阶版2

5.冒泡排序的时间复杂度和空间复杂度分析

(1).时间复杂度

1. 最坏情况

2. 最好情况

3. 平均情况

(2).空间复杂度

6.冒泡排序的实际应用场景与局限性

(1).应用场景

1. 小规模数据排序

2. 作为教学示例

(2).局限性

1. 时间效率低下

2. 不适用于实时性要求高的场景

总结


1.冒泡排序简述

在计算机科学的领域中,排序算法无疑是一块基石,它们在数据处理、数据库管理、算法设计等诸多方面都发挥着至关重要的作用。冒泡排序作为其中最为基础且直观的排序算法之一,虽然在效率方面可能不如一些高级排序算法,但它却以简洁易懂的特点,成为了初学者踏入排序算法世界的绝佳入门之选。在这篇详尽的博客中,我们将对 Python 中的冒泡排序进行全方位的解读,从基本原理到代码实现,再到性能分析以及实际应用场景,力求让您对冒泡排序有一个透彻的理解。

2.冒泡排序的起源与概念

冒泡排序的历史可以追溯到早期的计算机编程时代,它是最早被发明和广泛应用的排序算法之一。其名称的由来颇具趣味性,正如我们在日常生活中看到的气泡在液体中上浮的现象一样,在待排序的数列中,较小(或较大,取决于排序规则)的元素会如同气泡般逐渐 “浮” 到数列的合适位置,故而得名冒泡排序。

从概念上讲,冒泡排序是一种基于比较和交换操作的排序算法。它的核心思想是通过反复比较相邻的元素,并在必要时交换它们的位置,从而使数列中的元素逐渐按照特定的顺序(如从小到大或从大到小)排列。

3.冒泡排序的详细工作原理

本质:让一个数字和它相邻的下一个数字进行比较运算,如果前一个数大于后一个数字,就交换两个数据的位置.

假设有一组数据,6,5,3,1,8,7,2,4

首先,从数列的第一个元素开始,依次比较相邻的两个元素。比较6和5,因为6>5,所以交换这两个元素的位置,此时数列变为 [5, 6, 3, 1, 8, 7, 2, 4]。

接着,比较新数列中的第二个元素 6 和第三个元素 3,由于 6 > 3,再次交换它们的位置,得到 [5, 3, 6, 1, 8, 7, 2, 4]。然后比较 6 和 1,交换后变为 [5, 3, 1, 6, 8, 7, 2, 4]。

继续比较 6 和 8,因为 6 < 8,所以这两个元素位置不变,数列依然是 [5, 3, 1, 6, 8, 7, 2, 4]。再比较 8 和 7,交换后变为 [5, 3, 1, 6, 7, 8, 2, 4]。接着比较 8 和 2,交换后变为 [5, 3, 1, 6, 7, 2, 8, 4]。再比较 8 和 4,交换后第一轮排序结束,此时数列变为 [5, 3, 1, 6, 7, 2, 4, 8]。可以发现,经过第一轮的比较和交换操作,数列中的最大元素 8 已经 “浮” 到了数列的末尾。接下来还需要进行多轮这样的操作,才能将整个数列按照从小到大的顺序完全排好序哦。比如第二轮操作就会从数列的第一个元素开始,重复上述比较交换过程,但此时因为最大元素 8 已经在末尾了,就主要是对前面 7 个元素进行类似的处理,让第二大的元素也能 “浮” 到合适的位置,以此类推,直到整个数列有序。

4.Python 实现冒泡排序的多种方式

(1).普通版

nums = [6,5,3,1,8,7,2,4]
i = 0
while i < len(nums) - 1:
    i += 1
    n = 0
    while n < len(nums) - 1:
        # print(nums[n],nums[n+1])
        if nums[n]> nums[n+1]:
           nums[n],nums[n+1] = nums[n+1],nums[n]
        n += 1
 print(nums)

演示结果

(2).进阶版1

减少最后重复的判断

i = 0
count = 0
while i < len(nums) - 1:
    n = 0
    while n < len(nums) - 1 - i:
        # print(nums[n],nums[n+1])
        count += 1
        if nums[n]> nums[n+1]:
           nums[n],nums[n+1] = nums[n+1],nums[n]
        n += 1
    i += 1
#print(nums)
print("循环了%d次"%count)

演示结果

(3).进阶版2

加入标志位判断是否已经有序,在基本实现方式中,即使数列在排序过程中已经提前变得有序了,程序仍然会按照预定的轮数继续执行完所有的比较和交换操作。为了提高效率,我们可以加入一个标志位(flag)来判断数列是否已经有序,如果在某一轮排序中没有发生任何交换操作,就说明数列已经有序了,此时就可以提前结束排序过程。

count = 0
j = 0
while j < len(nums) - 1:
    # 在每一趟都定义一个flag
    flag = True    # 假设每一趟都没有换行
    i = 0
    while i < len(nums) - 1 - j:
        # print(nums[n],nums[n+1])
        count += 1
        if nums[i]> nums[i+1]:
            # 只要交换了,假设就不成立
            nums[i],nums[i+1] = nums[i+1],nums[i]
        i += 1
    if flag:
        # 这一趟走完以后,flag依然是True,说明这一趟没有进行过数据交换
        j += 1
 
print(nums)
print("循环了%d次"%count)

演示结果

5.冒泡排序的时间复杂度和空间复杂度分析

(1).时间复杂度

时间复杂度是衡量一个算法运行时间随输入规模增长而增长的趋势。对于冒泡排序来说,它的时间复杂度分析如下:

1. 最坏情况

当输入数据是逆序排列时,例如数列 [5, 4, 3, 2, 1] 要按照从小到大的顺序进行排序,每一轮排序都需要进行最多的比较和交换操作。

第一轮排序需要比较 n - 1 次(这里 n 是数列的长度),第二轮排序需要比较 n - 2 次,以此类推,最后一轮排序需要比较 1 次。

总的比较次数为:

所以,在最坏情况下,冒泡排序的时间复杂度为 ,其中 n 是要排序的数列的长度。

2. 最好情况

当输入数据已经是有序的,例如数列 [1, 2, 3, 4, 5] 要按照从小到大的顺序进行排序,每一轮排序只需要进行 n - 1 次比较操作(因为不需要进行交换),所以在最好情况下,冒泡排序的时间复杂度为 。

3. 平均情况

在实际应用中,输入数据的排列情况是随机的。对于随机排列的输入数据,平均情况下,冒泡排序的时间复杂度也趋近于 。

(2).空间复杂度

空间复杂度是衡量一个算法在运行过程中所需要的额外空间随输入规模增长而增长的趋势。

冒泡排序是一种原地排序算法,它在排序过程中只需要常数级别的额外空间来存储一些临时变量,比如在交换元素时使用的临时变量。

所以,冒泡排序的空间复杂度为 ,这意味着无论要排序的数列长度如何变化,它所需要的额外空间都是固定的。

6.冒泡排序的实际应用场景与局限性

(1).应用场景

虽然冒泡排序的效率相对较低,但在一些特定的场景下,它仍然有其应用价值。

1. 小规模数据排序

当需要排序的数据规模较小(例如,小于 100 个元素)时,冒泡排序的简单性和直观性使得它成为一个不错的选择。由于其代码实现简单,对于初学者来说容易理解和掌握,并且在小规模数据的情况下,它的运行时间也不会过长,所以可以满足一些简单的数据处理需求。

2. 作为教学示例

冒泡排序是排序算法中的经典示例,它以简洁易懂的方式展示了排序的基本原理 —— 通过比较和交换相邻元素来实现排序。因此,在计算机科学的教学过程中,它常被用作介绍排序算法的入门示例,帮助学生理解排序算法的概念、工作原理以及如何用代码实现。

(2).局限性

然而,冒泡排序也存在一些明显的局限性。

1. 时间效率低下

如前面所分析的,冒泡排序的时间复杂度在最坏和平均情况下都是 ,这使得它在处理大规模数据时效率非常低。随着数据规模的增大,其运行时间会呈平方级增长,导致排序过程变得非常缓慢。

2. 不适用于实时性要求高的场景

由于其低效率,在那些对排序速度有较高要求的实时性场景中,如实时数据处理、高频交易等领域,冒泡排序通常不适用。在这些场景中,需要使用更高效的排序算法,如快速排序、归并排序等,来满足快速排序的需求。

总结

通过这篇博客,我们对 Python 中的冒泡排序进行了全面而深入的研究。从它的起源与概念出发,详细剖析了其工作原理和多种实现方式,包括基本实现方式、优化实现方式以及可视化实现方式。我们还深入分析了它的时间复杂度和空间复杂度,探讨了它的实际应用场景和局限性。

冒泡排序虽然是一种简单的排序算法,但它在理解排序算法的基本原理方面有着重要的作用。对于初学者来说,它是进入排序算法世界的一把钥匙;对于有一定编程经验的人来说,它也可以作为优化算法性能的一个参考对象。希望这篇博客能够帮助您更好地理解和运用冒泡排序算法,以及在合适的场景下做出正确的选择。

这是我今天学Python的自我想法和对其的理解,有不对的地方请同志们多多包涵,谢谢观看!

相关文章
|
1月前
|
安全 数据安全/隐私保护 Python
Python学习的自我理解和想法(27)
本文记录了学习Python第27天的内容,主要介绍了使用Python操作PPTX和PDF的技巧。其中包括通过`python-pptx`库创建PPTX文件的详细步骤,如创建幻灯片对象、选择母版布局、编辑标题与副标题、添加文本框和图片,以及保存文件。此外,还讲解了如何利用`PyPDF2`库为PDF文件加密,涵盖安装库、定义函数、读取文件、设置密码及保存加密文件的过程。文章总结了Python在处理文档时的强大功能,并表达了对读者应用这些技能的期待。
|
1月前
|
Python
Python学习的自我理解和想法(26)
这是一篇关于使用Python操作Word文档的学习总结,基于B站千锋教育课程内容编写。主要介绍了通过`python-docx`库在Word中插入列表(有序与无序)、表格,以及读取docx文件的方法。详细展示了代码示例与结果,涵盖创建文档对象、添加数据、设置样式、保存文件等步骤。虽为开学后时间有限下的简要记录,但仍清晰梳理了核心知识点,有助于初学者掌握自动化办公技巧。不足之处欢迎指正!
|
2月前
|
数据采集 数据挖掘 Python
Python学习的自我理解和想法(22)
本文记录了作者学习Python第22天的内容——正则表达式,基于B站千锋教育课程。文章简要介绍了正则表达式的概念、特点及使用场景(如爬虫、数据清洗等),并通过示例解析了`re.search()`、`re.match()`、拆分、替换和匹配中文等基本语法。正则表达式是文本处理的重要工具,尽管入门较难,但功能强大。作者表示后续会深入讲解其应用,并强调学好正则对爬虫学习的帮助。因时间有限,内容为入门概述,不足之处敬请谅解。
|
2月前
|
索引 Python
Python学习的自我理解和想法(24)
本文记录了学习Python操作Excel的第24天内容,基于B站千锋教育课程。主要介绍openpyxl插件的使用,包括安装、读取与写入Excel文件、插入图表等操作。具体内容涵盖加载工作簿、获取单元格数据、创建和保存工作表,以及通过图表展示数据。因开学时间有限,文章简要概述了各步骤代码实现,适合初学者参考学习。如有不足之处,欢迎指正!
|
1月前
|
Python
Python学习的自我理解和想法(25)
这是一篇关于Python操作Word文档(docx)的教程总结,基于B站千锋教育课程学习(非原创代码)。主要内容包括:1) docx库插件安装;2) 创建与编辑Word文档,如添加标题、段落、设置字体样式及保存;3) 向新或现有Word文档插入图片。通过简单示例展示了如何高效使用python-docx库完成文档操作。因开学时间有限,内容精简,后续将更新列表和表格相关内容。欢迎指正交流!
|
2月前
|
Python
Python学习的自我理解和想法(23)
本文记录了学习Python正则表达式的第23天心得,内容基于B站麦叔课程。文章分为三个部分:1) 正则表达式的七个境界,从固定字符串到内部约束逐步深入;2) 写正则表达式的套路,以座机号码为例解析模式设计;3) 正则表达式语法大全,涵盖字符类别、重复次数、组合模式、位置、分组、标记、特殊字符和替换等知识点。总结中表达了对知识的理解,并欢迎指正。
|
3月前
|
机器学习/深度学习 存储 设计模式
Python 高级编程与实战:深入理解性能优化与调试技巧
本文深入探讨了Python的性能优化与调试技巧,涵盖profiling、caching、Cython等优化工具,以及pdb、logging、assert等调试方法。通过实战项目,如优化斐波那契数列计算和调试Web应用,帮助读者掌握这些技术,提升编程效率。附有进一步学习资源,助力读者深入学习。
|
1月前
|
数据采集 安全 BI
用Python编程基础提升工作效率
一、文件处理整明白了,少加两小时班 (敲暖气管子)领导让整理100个Excel表?手都干抽筋儿了?Python就跟铲雪车似的,哗哗给你整利索!
64 11
|
3月前
|
人工智能 Java 数据安全/隐私保护
[oeasy]python081_ai编程最佳实践_ai辅助编程_提出要求_解决问题
本文介绍了如何利用AI辅助编程解决实际问题,以猫屎咖啡的购买为例,逐步实现将购买斤数换算成人民币金额的功能。文章强调了与AI协作时的三个要点:1) 去除无关信息,聚焦目标;2) 将复杂任务拆解为小步骤,逐步完成;3) 巩固已有成果后再推进。最终代码实现了输入验证、单位转换和价格计算,并保留两位小数。总结指出,在AI时代,人类负责明确目标、拆分任务和确认结果,AI则负责生成代码、解释含义和提供优化建议,编程不会被取代,而是会更广泛地融入各领域。
116 28
|
3月前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。

热门文章

最新文章

推荐镜像

更多