python冒泡排序与常用数学计算
一 、冒泡排序:
冒泡排序:
属于交换排序;
两两比较大小,交换位置,如同水泡大的往上(右)跑;
n个数从左至右编号从0到n-1,索引0和1比较,如果索引0大,则交换两者位置;
如果索引1大则不用交换继续比较索引1和2的值,将大值放在右侧,直到n-2和n-1
比较完,第一轮比较完成,第二轮从索引0比较到n-2,因为最右侧n-1位置上已经是
最大值了,依次类推,第一轮都会减少最右侧的不参与比较,直到剩下最后2个数比较.
以上定义在任何编程语言中都是同样的实现逻辑,以下在python中实现.
1、冒泡简单实现
参考代码
num_list = [[1,3,2,6,5,9,8,4,7],[1,2,3,4,5,6,7,8,9],[1,2,3,4,9,6,7,8,5],[2,4,5,1,7,9,6,3,8]]nums = num_list[0] # [1,3,2,6,5,9,8,4,7]
length = len(nums) #获取排序的长度for i in range(length):for j in range(length -i -1): #每比对一遍 找到最大的在最右边if nums[j] > nums[j+1]: #如果左边的比右边的大tmp = nums[j] #暂存这个大的数nums[j] = nums[j+1] #这个大数的位置换成 右边的较小的数nums[j+1] = tmp #把大的数放到右边#nums[j],nums[j+1] = nums[j+1],nums[j] #以上三行可写成一行
print(nums)
对以上代码加入统计交换与比对次数
实现流程如下:
第1次 --> [1,9,8,5,6,7,4,3,2] [1,8,9,5,6,7,4,3,2] [1,8,5,9,6,7,4,3,2] [1,8,5,6,9,7,4,3,2] [1,8,5,6,7,9,4,3,2][1,8,5,6,7,4,9,3,2] [1,8,5,6,7,4,3,9,2] [1,8,5,6,7,4,3,2,9] #第一遍时找出最大的数9 放到N-1位即最后一位第2次--> [1,5,8,6,7,4,3,2,9] [1,5,6,8,7,4,3,2,9] [1,5,6,7,8,4,3,2,9] [1,5,6,7,4,8,3,2,9] [1,5,6,7,4,3,8,2,9][1,5,6,7,4,3,2,8,9] #第二遍时找出最大的8 n-2位 以次类推第3次 --> [1,5,6,7,4,3,2,8,9] [1,5,6,4,7,3,2,8,9] [1,5,6,4,3,7,2,8,9] [1,5,6,4,3,2,7,8,9] 第4次 --> [1,5,6,4,3,2,7,8,9] [1,5,4,6,3,2,7,8,9] [1,5,4,3,6,2,7,8,9] [1,5,4,3,2,6,7,8,9] 第5次 --> [1,5,4,3,2,6,7,8,9] [1,4,5,3,2,6,7,8,9] [1,4,3,5,2,6,7,8,9] [1,4,3,2,5,6,7,8,9] 第6次 --> [1,4,3,2,5,6,7,8,9] [1,3,4,2,5,6,7,8,9] [1,3,2,4,5,6,7,8,9] 第7次 --> [1,3,2,4,5,6,7,8,9] [1,2,3,4,5,6,7,8,9] 第8次 --> [1,2,3,4,5,6,7,8,9] 第9次 --> [1,2,3,4,5,6,7,8,9]
2、加入统计
参考代码:
num_list = [[1,3,2,6,5,9,8,4,7],[1,2,3,4,5,6,7,8,9],[1,2,3,4,9,6,7,8,5],[2,4,5,1,7,9,6,3,8]]
nums = num_list[0]
count = 0 #定义比对次数
count_swap = 0 #定义交换次数
length = len(nums)for i in range(length):for j in range(length - i - i):count += 1if nums[j] > nums[j + 1]:tmp = nums[j]nums[j] = nums[j + 1]nums[j + 1] = tmp#nums[j],nums[j+1] = nums[j+1],nums[j] #以上三行赞同于这一行count_swap += 1Flag = True # 是否产生交换if not Flag: # 在没有 产生交换时退出break
print(nums, count_swap, count)
打印结果:
当我们把一组数换成nums[1] 即[1,2,3,4,5,6,7,8,9] 时
结果:
我们可以发现即使给出的数已经是排序好的,程序依然需要遍历比对N次,这显然不合理.
3、冒泡排序优化
由于以上的简单排序,无论一组数怎么的排列(即使已经是按从小到大的正确排列)都需要全部的比对一次,效率低下,因此需要优化 ,即在一轮比对后,下一次没有发生任何交换时,退出,直接打印结果,如:
参考代码:
num_list = [[1,3,2,6,5,9,8,4,7],[1,2,3,4,5,6,7,8,9],[1,2,3,4,9,6,7,8,5],[2,4,5,1,7,9,6,3,8]]nums = num_list[0]count = 0 #定义比对次数count_swap = 0 #定义交换次数length = len(nums)Flag = Falsefor i in range(length):Flag = Falsefor j in range(length -i -1):count +=1if nums[j] >nums[j+1]:tmp = nums[j]nums[j] = nums[j+1]nums[j+1] = tmpcount_swap +=1Flag = True #是否产生交换if not Flag: #在没有 产生交换时退出break
print(nums,count_swap,count)以下是另一种写法,可能更好理解:
def bubble_sort(nums):length = len(nums)count = 0swap = 0for i in range(0, length):count +=1for j in range(i + 1, length):if nums[i] > nums[j]:nums[i], nums[j] = nums[j], nums[i]swap +=1return nums,count,swap
print(bubble_sort(nums))
结果如下:
很明显 这次交换数为0,即没有 发生交换,遍历比对数是8,大大提高了效率
4、冒泡总结:
冒泡法需要数据一轮轮的比较;
可以设定一个标记判断此轮是否有数据交换发生,如果没有发生交换,可以结束排序,如果发生交换继续下一轮排序
最差的排序情况是初始顺序与目标顺序完全相反,遍历次数1...n-1之和n(n-1)/2
最好的排序情况:初始顺序与目标顺序相同,遍历次数n-1
时间复杂度O(n^2)
二、鸡兔同笼问题(二元一次方程)
问题:
一只笼子里有鸡和兔子共计10只把它们的脚加起来共计32只,问鸡和兔子各有多少只?
思路:我们可以用初中的二次一次方程来解,即:
设鸡x,兔为y则
x + y = 10
2x +4y = 32
以上只不过是我们初中学到的二元一次方程而已,
参考代码 :
for x in range(10): #因为鸡在10以内for y in range(10): #兔子也在10以内a = x + y #类似试着尝试b = 2*x + 4*yif a == 10 and b == 32: #即x+y == 10同时 脚数是32时 成立 print("鸡有:%s,兔有:%s" %(x,y))
打印结果:
三、最大公约数
问题:给出两个整数,求出最大公约数 ,
公约数:是指两个整数的公共约数(能整除被除数的数)中最大的数.
辗转相除法(又称欧几里得算法) 就是一个机械地求最大公约数问题的算法。
分为除法运算和减法运算两种方法.
假设给出两个数12 42求出最大公约数?
这里使用减法运算,除法运算可以自行尝试.
所谓减法运算法,就是在给出的两个数中以大的不断的送去小的数,最终得到的就是两个数的公约数.
参考代码 :
def MaxP(a,b):aa = abb = bwhile a != b:if a >b:a = a -btmp =aelse:b = b -atmp = breturn "%s和%s最大公约数%s" %(aa,bb,tmp)
运行结果:
注意1是所有数的公约数!
四、判断一个数是否为素数
素数:不能被任何比它自身小的整数而整除的数(除1和自身)
问题:给定一个数判断它是否是一个素数,通过定义我们来写出程序.
参考代码 :
def IsS(x):for i in range(2,x):if x % i == 0:return ("%s is not 素数!" %x)return ("%s is 素数!" %x)
print(isS(99991))
运行结果:
五、猴子吃桃问题
问题:
猴子摘取了一些桃子,当即吃了一半又多吃了一个,第二又吃了剩下的一半,又多吃一个,依次吃法,每天吃前一天的一半再多吃一个,第十天时猴子发现就剩下一个桃子了,请问当初猴子一共摘了多少桃子 ?
分析:
此题是小学奥数题,倒着往前推,第10天还没有吃就只剩下1个桃子,假设第九天还有x个桃子 ,那么第十天就是:x %2 -1 =1,算出 第九天有四个桃子,以此类推即可.
参考代码:
num =1 #第10天还没有吃呢就剩下 1
print("第10天还没有吃呢就剩下 1 个桃子了!")
for day in range(9,0,-1): #倒推从第九天开始算#num = (num+1) *2 #现在 剩下的就是前一天加1再乘以2print("第 %d 天还有 %d 个桃子!" %(day,num))
运行结果:
留下 一个思考题目:
现有一个已经排好序的数组,现在需要往里插入一个数,要求被插入的数需要按原来的规律插入.
参考代码:
def Ssort(L,a):L.append(a)length = len(L)for i in range(length):for j in range(i+1,length):if L[i] > L[j]:L[i],L[j] = L[j],L[i]return L
以上都是一些典型的数学问题,转变成代码,可见数学和编程是分不开的,至少都讲究逻辑啊,目前只列举这些,后期如果还有我会再更新上来,欢迎大家留言指正!
相关文章:

题目 1477:【蓝桥杯】【入门题】字符串输入输出函数
题目 1477:字符串输入输出函数 蓝桥杯刷题群已成立,微信后台回复【蓝桥杯】,即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 编写函数GetReal和GetString,在main函数中分别调用这…

Android游戏开发基础part2--Canvas画布
游戏开发基础part2--Canvas画布 又过了一周才继续做总结,四级结束了,应该可以多点时间学习游戏编程了。 Canvas画布类是一个在游戏当中担当非常重要的角色,它可以绘制出不同的图形和图片,可以说没有了画布就不能做出画面炫丽的游戏…

JavaScript有哪三部分组成?
在学习web前端技术时,最常见的也是需要最着重学习的就是JavaScript这一方面,工作中也是会经常用到的,那么JavaScript有哪三部分组成呢?来看看下面的详细介绍。 JavaScript有哪三部分组成? JavaScript的组成 JavaScript由ECMScript、BOM和DO…

【蓝桥杯】【入门题】【算法提高VIP】1480:模拟计算器
题目 1480:模拟计算器 蓝桥杯刷题群已成立,微信后台回复【蓝桥杯】,即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 使用Switch语句编写一个模拟简单计算器的程序。依次输入两个整数和一个字…

《c和指针》笔记5
递归 C通过运行时堆栈支持递归函数。的哦贵函数就是直接或间接调用自身的函数。 递归函数所需要的2个特性: 1、存在限制条件,当符合这个条件时递归便不再继续。 2、每次调用之后越来越接近这个限制条件。 递归函数在实现方面更加接近问题的抽象定义&…

怎么获得combobox的valueField值
var a; var dwField new Ext.form.ComboBox({ fieldLabel:管理员, mode: local, width:70, id:user_name, …

哪些人适合学习java技术
java技术在互联网行业一直都是非常重要的存在,学习java技术只会多不会少,那么目前哪些人适合学习java技术呢?来看看下面的详细介绍就知道了。 哪些人适合学习java技术? 1.在家待业人员,没有明确的目标,不知道自己想要什么&#…

AS3版本的MaxRects算法测试
早上,在微博发现一条信息,关于MaxRects算法的,杜增强DzQ 移植的关于AS3版本的MaxRects算法,具体地址是:http://www.duzengqiang.com/blog/post/971.html 代码如下: /* Based on the Public Domain MaxRecta…

android 52 粘滞广播
粘滞广播:广播发送出去以后,广播接收者还没有创建,当广播接收者注册的时候就可以接收,如果不是粘滞广播则如果没有广播接收者就以后不能再接收了。 mainActivity: package com.sxt.day07_07;import android.app.Activity; import …

【蓝桥杯】【入门题】【算法提高VIP】1481:剪刀石头布
题目 1481:剪刀石头布 蓝桥杯刷题群已成立,微信后台回复【蓝桥杯】,即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 编写程序实现“剪刀,石头,布”游戏。在这个游戏中…

UI设计培训学习中必须掌握的设计原则
不管是刚开始学习UI设计或者已经在学习UI设计同学中,UI设计的设计原则都是非常重要的,需要大家去重点关注的,下面小编就为大家详细的介绍一下UI设计培训学习中必须掌握的设计原则。 UI设计培训学习中必须掌握的设计原则: 重复 在平…

【复盘】如何培养小朋友的编程能力?
Scratch家长群已成立,微信后台回复【Scratch家长群】,即可进入。 如果加入了之前的社群不需要重复加入。 前几天,我在得到听了 邵慧宁的故事,就想着把游戏化的思维应用于培养自己孩子的编程能力上,并邀请志同道合的家长…

ubuntu系统下载编译android源码
在ubuntu系统下编译android需要注意的事项:1. 参考http://source.android.com/中的安装说明。2. 安装JDK6中碰到的问题可以参考http://hi.baidu.com/designhouse/item/0dbece7c4f6af0376e29f6c1中的说明,记得配置环境变量。3. 下载代码时如果出现timeout…

[windows server 2008 站点系列五]一招加速域用戶的文件查找速度
在企业IT基础环境中,文件服务器的应用越来越平凡,而文件服务器的数量也随之增多。作为IT应用人员习惯性的从管理者的角度出发,找寻DFS等帮助简化管理维护的解决方案。但是,另一方面,企业用户往往很难在为数众多的文件服…

在web.xml文件中配置Servlet时,主要配置哪些信息?
web前端的学习内容是比较多的,其中有一部分就是关于在web.xml文件中配置Servlet时的相关内容,在web.xml文件中配置Servlet时,主要配置哪些信息?来看看下面的详细介绍。 使用IDE开发Servlet时,配置信息可以通过可视化方式定义。然…

Oracle Study之--ORA-12537(TNS:connection closed) 错误案例
系统环境: 操作系统:RedHat EL55 Cluster: Oracle 11gR2 GRID Oracle: Oracle 11gR2 在构建Oracle 11gR2 RAC时出现以下错误: 1、建库时 2、Listener 日志信息 3、客户端连接错误信息 解决方案: 123456789…

MEF: MSDN 杂志上的文章(9) 控制部件创建策略 ???
http://msdn.microsoft.com/zh-cn/magazine/ee291628.aspx 默认情况下,容器中的所有部件实例都是单例,因而由在容器中导入它们的所有部件共享。因此,SalesOrderView 和 ViewFactory 的所有导入程序都将获得同一实例。在很多情况下需要这样&am…

【青少年编程】绘制等腰直角三角形
Scratch竞赛交流群已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】,即可进入。 如果加入了之前的社群不需要重复加入。 类比思维就是指把两个或者两类事物进行比较,并进行逻辑推理,找出两者之间的…

考PMP证书一定要参加PMP培训吗?
考PMP证书一定要参加PMP培训吗?这是目前很多想要考pmp认证的小伙伴比较关心的一个问题,小编可以肯定的回答大家,当然需要参加,具体来看看下面的详细介绍。 考PMP证书一定要参加PMP培训吗?当然要,PMP考试要接受PMO授权许可培训…

Apache+PHP in MAC
是以为记,当前OSX下的ApachePHP配置。我的配置跟这篇文章应该一样:http://www.ccvita.com/398.htmlApache重启: apachectl restart|start|stopApache配置文件: /etc/apache2/httpd.conf (php5在这里开启)Apache虚拟主机…

【青少年编程】绘制五角星
Scratch竞赛交流群已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】,即可进入。 如果加入了之前的社群不需要重复加入。 类比思维就是指把两个或者两类事物进行比较,并进行逻辑推理,找出两者之间的…

Kafka 消息监控 - Kafka Eagle
1.概述 在开发工作当中,消费 Kafka 集群中的消息时,数据的变动是我们所关心的,当业务并不复杂的前提下,我们可以使用 Kafka 提供的命令工具,配合 Zookeeper 客户端工具,可以很方便的完成我们的工作。随着业…

java开发培训好学习吗?难度大不大?
互联网快速的发展,不断的在进行变革和更新,越来越多的人都对这个行业充满向往,很多人都想要学习java技术,那么java开发培训好学习吗?难度大不大?来看看下面的详细介绍。 java开发培训好学习吗?难度大不大?首先,…

gdb 调试动态库
原文链接 cat get.h int get (); int set (int a); cat get.c #include <stdio.h> #include "get.h" static int x0; int get () { printf ( "get x%d\n ", x); return x; } int set (int a) { printf …

【青少年编程】【一级】森林的一天
Scratch竞赛交流群已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】,即可进入。 如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取该程序的代码。 森林的一天 1. 准备工作 (1…

Visual Studio Extensions for SharePoint v1.1
下载Visual Studio Extensions for SharePoint v1.1User Guide1、此版本(1.1)稍后会发布中文版2、此版本仍然只支持Visual Studio 20053、此版本仍然必须安装在包含了SharePoint Server(或WSS)、Visual Studio的机器上4、下个版本…

零基础学Java需要做哪些准备
想要成为一名合格的java工程师,那么好好学习java技术是非常重要的,对于零基础同学们来说,大家比较关注的就是“零基础学Java需要做哪些准备”这个问题,下面小编就来为大家做下详细的介绍。 零基础学Java需要做哪些准备? 1.制定学…

C# 启动外部程序的几种方法
C# 启动外部程序的几种方法: 1. 启动外部程序,不等待其退出。 2. 启动外部程序,等待其退出。 3. 启动外部程序,无限等待其退出。 4. 启动外部程序,通过事件监视其退出。 // using System.Diagnostics; private string…

在Mac和Linux之间用Rsync 拷贝文件
因为公司的苹果服务器是物理机,所以备份一直是个问题。Backup Exec 2012 勉强能工作,但是速度和可靠性一直都被我们所诟病。最后,老板决定把所有的数据copy到linux的共享文件夹,然后用Veeam 备份。 *IX系统里面说起拷贝࿰…

【复盘】升级打怪第一关,冲啊!
Scratch竞赛交流群已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】,即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档)。 利用游…