热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python冒泡排序理解_八大排序python实现精讲(一)冒泡排序

写在前面,排序算法属于面试中绝对不会错过的一道题,不管是原理,手撕,变形,优化,全都是考点。接

写在前面,排序算法属于面试中绝对不会错过的一道题,不管是原理,手撕,变形,优化,全都是考点。

接下来更的几篇文章争取全面考虑,从面试官的角度解析排序算法以及对应回答~如果喜欢的话可以点赞收藏关注!及时收获知识~

总结

先来总结一下即将展开的八大排序算法。

排序算法可以依据以下几个标准划分成不同的类别(来自维基百科排序算法):计算的时间复杂度(最差、平均、和最好性能)

空间复杂度(所需额外辅助存储空间)

稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前

依据排序的方法:插入、交换、选择、合并等等。

一图概览排序算法

冒泡排序(Bubble Sort)

从最简单的开始讲起。冒泡排序属于非常好理解的排序算法了。这是我上学的时候接触的第一个排序算法,记忆犹新~

算法思想

思想很简单,从左到右,比较两个相邻的元素。如果这两个数字顺序不是升序,就交换这两个数字,小的在前大的在后。直到最后没有数字需要交换。

由于数字越大,越往下沉,沉到数组的最后位置。数字越小,越上浮,浮到数组最前位置,所以叫做冒泡排序~

动图非常直观~ (图片来自网络)冒泡排序属于交换类

算法步骤

从左到右:比较两个相邻元素,看是否为升序,即第一个元素小于第二个元素。如果不是升序,交换这两个元素在数组中的位置。

每一对相邻元素,都要做一次这样的比较。假设数组长度为n,需要比较n-1次。这样比较一轮,最大的数字会沉到数组最右侧。下一次则不需要比较最后的数字。

重复,没有元素需要交换为止。

代码实现

import random

def gen_random_data(start, end, number):

# 用于生成数据的方法,数字大小在start到end之间,共number个数字

res = []

for i in range(number):

res.append(random.randint(start,end))

return res

def Bubble_Sort(array):

for i in range(1, len(array)):

for j in range(len(array) - i):

if array[j] > array[j + 1] :

tmp = array[j]

array[j] = array[j + 1]

array[j+1] = tmp

真的太困了。。改进思路与总结明天写~如果对这个系列内容感兴趣,可以收藏关注点赞~明天继续更!真的不鸽了!困到恍惚

-----------------20200513更新-----------------

改进思路

假设有数组[2,3,4,5,7,6],冒泡排序,需要进行5趟排序。但是第一趟排序进行后,数组变为[2,3,4,5,6,7],已经有序,不需要再进行排序了。但是按照上面的经典排序,仍然需要进行4趟排序。

改进方法可以考虑设置一个标志位,当某趟排序没有产生数据交换,就代表数组已经有序,这样就可以结束排序。

def Bubble_Sort_Opt(array):

flag = True

for i in range(1, len(array)):

if flag:

flag = False

for j in range(len(array) - i):

if array[j] > array[j + 1] :

tmp = array[j]

array[j] = array[j + 1]

array[j+1] = tmp

# print(array)

flag = True

总结

冒泡排序属于最经典的排序算法,由于其直观性,很容易被应试者作为第一个解决办法想到。

由于每次交换,只需要临时存储一个数字,所以空间复杂度为O(1)。

最好情况是数据是已经有序的,这样遍历一次就可以结束,最好时间复杂度为O(n)。

最坏情况是数据是逆序,这样每次遍历都需要交换一次,最坏时间复杂度为

equation?tex=O%28n%5E2%29

由于出现两个相同数字不会导致交换,所以相同数字相对位置不变,冒泡排序是稳定的排序算法。



推荐阅读
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
author-avatar
忧伤玫瑰coco_873
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有