python中排序从小到大_从Python看排序:冒泡排序

冒泡排序在排序算法中是最简单的一种,它通过多次遍历列表,将最大的元素冒泡到列表的头部或尾部。我们通过对四张扑克牌(花色相同)以从小到大的方式进行排序来演示该算法的工作原理。首先将扑克牌面朝上放在桌上,如下图所示:

5934bcc0-a907-11e3-864f-00163e0309b4.jpg

该算法要求多次遍历扑克,每次都从头开始,并在上一次遍历的前一张结束。在每一次遍历中,总是从前两张牌开始。如果前者比后者大,则交换位置。

6a05fd16-a907-11e3-b1a1-00163e0309b4.jpg

然后比较第二张和第三张,同样如果前者更大则互换,否则保持原样。

7a922cf4-a907-11e3-8bdb-00163e0309b4.jpg

这样依次类推,直到将最大的那一张牌移动到最后。

下图演示了接下来的两次遍历。第二次遍历将会使第二大的牌交换至倒数第二的位置上,第三次只需比较头两张,然后整个流程结束。

a06ffe06-a907-11e3-a519-00163e0309b4.jpg

下面是Python版的冒泡排序:

# Sorts a sequence in ascending order using the bubble sort algorithm.

def bubbleSort( theSeq ):

n = len( theSeq )

# Perform n-1 bubble operations on the sequence

for i in range( n - 1 ) :

# Bubble the largest item to the end.

for j in range( i + n - 1 ) :

if theSeq[j] > theSeq[j + 1] : # swap the j and j+1 items.

tmp = theSeq[j]

theSeq[j] = theSeq[j + 1]

theSeq[j + 1] = tmp

冒泡排序的效率仅仅取决于列表中元素的个数,与元素的值和初始序列无关。为了确认其效率,我们必须知道一个含有N个元素的列表在排序时内层循环总的执行次数。外层一共会循环n - 1次,因为需要遍历n - 1次列表。而内层循环不定,第一次列表遍历执行n - 1次,第二次n - 2次,第三次则是n - 3次,直到最后一次遍历内层只需执行1次即可。这样,内部循环总的遍历次数是前n - 1个整数的总和,即等同于:

ccc0017c-a907-11e3-aa92-00163e0309b4.jpg

得到其时间复杂度为O(n2)。正因如此,冒泡排序是排序算法中效率最低的一种。如果给定一个倒序的列表,那每次迭代的内层循环中都会做交换操作,这在实际操作中无疑是非常耗性能的。

在前面的代码中,其内层循环总是n2,但如果给定序列已经是排好序的呢?该情况下,排序实际是不需要的,但代码并不知情,它依然如此辛勤劳作,以至于其性能依旧是n2。

更多请参考:Rance D. Necaise - 《Data Structures and Algorithms Using Python》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shell else if mysql_Shell if else语句(详解版)

和其它编程语言类似,Shell 也支持选择结构,并且有两种形式,分别是 if else 语句和 case in 语句。本节我们先介绍 if else 语句,case in 语句将会在《Shell case in》中介绍。如果你已经熟悉了C语言、Java、JavaScript 等其它编程…

【Java并发编程】:使用synchronized获取互斥锁

在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,…

WildFly Swarm –将Java EE应用程序部署为独立的Jar

WildFly Swarm为将Java EE应用程序部署为独立的Jar文件提供了一种简单的解决方案。 这使得部署应用程序特别是REST或Web服务非常容易。 Swarm在这方面与Spring Boot非常相似,因为它可以快速开发Web(.War)应用程序,然后将其部署为独…

c语言三个数从小到大排序/输出_我的c语言笔记(三)

int表达式这个表达式存在的目的在于将表达式转为整数。比如:float a9999.9999;int b;b(int)(a/1000);就可以得到9啦,别忘了套上固定格式哦~然后我们接下来一起来做一道很重要的题哦,反复练习,可以顺利拿下同…

java虚拟_Java虚拟机(JVM)工作原理

虽然本教程的内容为 x86 处理器的原生汇编语言,但是了解其他机器架构如何工作也是有益的。JVM 是基于堆栈机器的首选示例。JVM 用堆栈实现数据传送、算术运算、比较和分支操作,而不是用寄存器来保存操作数(如同 x86 一样)。数据结构,让它们协…

MVC5 + EF6 + Bootstrap3

MVC5 EF6 Bootstrap3 (16) 客户端验证摘要: 本节介绍MVC客户端验证。阅读全文posted 2015-05-26 07:15 Slark.NET 阅读(6333) | 评论 (21) 编辑MVC5 EF6 Bootstrap3 (15) 应用ModelState和Data Annotation做服务器端数据验证摘要: 本节我们用两种不同的方法ModelState和Da…

java for循环break_Java中break、continue、return在for循环中的使用

这篇文章主要介绍了break、continue、return在for循环中的使用,本文是小编收藏整理的,非常具有参考借鉴价值,需要的朋友可以参考下引言:在使用循环的时候,循环里面带有break、continue、return的时候经常弄混,今天特意…

python 定义字符串变量_python 字符串(1)

字符串 操练一下字符串吧。 >>> print "good good study, day day up" good good study, day day up 在python中,通常用一对双引号、或者单引号来包裹一个字符串。或者说,要定义一个字符串,就用双引号或者单引号。 转义字…

play 拦截器_编写Play 2的模块,第2部分:拦截器

play 拦截器在本教程的第一部分中,我们介绍了创建,发布和调用模块的基本知识。 我们创建的模块并没有真正做很多事情,因此现在是时候使用Play的某些功能来扩展功能了。 1.拦截器 拦截器使您可以拦截对控制器的调用,并增强或阻止其…

java string blob_java String类型转换为Blob类型

展开全部这个是mysql下存取blob字段的一个很简单的类,跟据自己的需要32313133353236313431303231363533e4b893e5b19e31333332623936改改就行了/*** Title: BlobPros.java* Project: test* Description: 把图片存入mysql中的blob字段,并取出* Call Module…

架构之Nginx(负载均衡/反向代理)

Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器 ,也是一个 IMAP/POP3/SMTP 代理 服务器 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式…

Neo4j:特定关系与一般关系+属性

为了在Neo4j查询中获得最佳的遍历速度,我们应该使关系类型尽可能具体 。 让我们看一下几周前我在Skillsmatter上发表的“ 建模建议引擎建模 ”演讲中的一个例子。 我需要决定如何为成员和事件之间的“ RSVP”关系建模。 一个人可以对事件表示“是”或“否”&#…

java 获取 网卡名称_Java获取网卡信息详解

InterfaceAddress 类表示一个由名称和分配给此接口的 IP 地址列表组成的网络接口。它用于标识加入多播组的本地接口。 接口通常是按名称(如 "le0")区分的。NetworkParameterDemo.javaimport java.net.InterfaceAddress;import java.net.NetworkInterface;import java…

java 按位置格式化字符串_Java字符串格式化,{}占位符根据名字替换实例

我就废话不多说了,大家还是直接看代码吧~import java.beans.PropertyDescriptor;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;public class StringFormatUtil …

Dropzone.js实现文件拖拽上传

dropzone.js是一个开源的JavaScript库,提供 AJAX 异步文件上传功能,支持拖拽文件、支持最大文件大小、支持设置文件类型、支持预览上传结果,不依赖jQuery库。 查看演示 下载源码使用Dropzone 我们可以建立一个正式的上传form表单,…

java 获取系统时间 8小时 jre_Java获取时间与系统时间相差8小时终极解决方案

0、引言Druid中时区的问题一直困扰着我们,所以我专门去研究了一下世界时区和Java中的时区,对使用Druid很用帮助.1、UTC时间&GMT时间UTC时间是时间标准时间(Universal Time Coordinated),UTC是根据原子钟来计算时间,误差非常小…

Apache Drill 1.4性能增强的简要概述

今天,我们很高兴宣布Apache Drill 1.4现已在MapR发行版中可用。 钻1.4是MAPR生产就绪和支持的版本,可以从下载这里 ,找到1.4版本说明这里 。 Drill 1.4以其高度灵活和可扩展的体系结构为基础,带来了多种新功能以及对查询性能的增…

【01背包】洛谷P1282多米诺骨牌

题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,S161119,S2153211,|S1-S2|2。每个多米诺骨牌…

java geolitecity_GeoLite2 Java根据IP获得城市、经纬度

之前我们介绍过通过 qqwry.dat 根据IP获得所属城市和运营商信息。但是这个 qqwry.dat 已经太久没更新了,数据有些不准确,而且现在我们有个需求就是想获取某个IP所在的经纬度。这里我们可以使用 GeoLite2,这个是国外开源的一个库,需…

Leetcode:search_insert_position

一、 题目 给定一个数组和要插入数的大小。求插入的位置。 二、 分析 太水&#xff0c;直接扫描。过……. class Solution { public:int searchInsert(int A[], int n, int target) {for(int i0;i<n;i) {if(target<A[i]) {return i;} }return n;} };转载于:https…