排序算法:【冒泡排序】、逻辑运算符not用法、解释if not tag:

注意:

1、排序:将一组无序序列,调整为有序的序列。所谓有序,就是说,要么升序要么降序。

2、列表排序:将无序列表变成有序列表。

3、列表这个类里,内置排序方法:sort( ),只可以对列表进行排序;而python内置函数sorted( )可以对序列进行排序,即:可以对列表、字符串、集合、字典、元组进行排序。

4、常见的排序算法:

推荐快速排序、堆排序、归并排序

不推荐:冒泡排序、选择排序、插入排序

其它排序:希尔排序、计数排序、基数排序。

一、冒泡排序 ——时间复杂度:O(n^{2})

        例如,想要得到一个升序的列表,(默认升序)则依次比较相邻的两个数,如果前面的数比后面的数,则交换这两个数,一趟下来,最大的数跑到了最后,即:一趟下来,无序区减少一个数,有序区增加一个数。

相反,如果想得到降序,则依次比较相邻的两个数,如果前面的数比后面的数则交换这两个数。对于代码,只需要把 

li[j] > li[j + 1]  改为 

li[j] li[j + 1]即可。

它是原地排序,不需要新建列表,而是在原来列表上通过交换来进行排序。

代码:

以升序为例,分别用三种方式表示列表:推荐第三种!!!

1、列表写死:

def bubble_sort(li):for i in range(len(li) - 1):  # 总共要排n-1趟for j in range(len(li)-1-i):  # 每趟里,依次比较相邻的两个数if li[j] > li[j + 1]:li[j], li[j + 1] = li[j + 1], li[j]l1 = [1, 4, 3, 2]
bubble_sort(l1)
print(l1)# 结果:
[1, 2, 3, 4]

2、列表不写死,用生成随机整数方式生成列表

import randomdef bubble_sort(li):for i in range(len(li) - 1):  # 总共要排n-1趟for j in range(len(li) - 1 - i):  # 每趟里,依次比较相邻的两个数if li[j] > li[j + 1]:li[j], li[j + 1] = li[j + 1], li[j]l1 = [random.randint(1, 10) for i in range(4)]  # 从1~10里,随机生成4个数
print("待排序列为:", l1)
bubble_sort(l1)
print("冒泡排序后:", l1)# 结果:
待排序列为: [8, 1, 3, 6]
冒泡排序后: [1, 3, 6, 8]

3、列表由用户输入

(1)排成升序:

def bubble_sort(li):for i in range(len(li) - 1):  # 总共要循环n-1趟for j in range(len(li) - 1 - i):  # 每趟里,依次比较相邻的两个数if li[j] > li[j + 1]:  #  !!!排成升序li[j], li[j + 1] = li[j + 1], li[j]l1 = list(map(int, (input().split())))  # 用户输入列表
bubble_sort(l1)
print(l1)  # 输出最后的排序结果输入:7 4 2 1# 结果:
[1, 2, 4, 7]
!!优化1:想要看到每一趟排序完的结果:
def bubble_sort(li):for i in range(len(li) - 1):  # 总共要循环n-1趟for j in range(len(li) - 1 - i):  # 每趟里,依次比较相邻的两个数if li[j] > li[j + 1]:li[j], li[j + 1] = li[j + 1], li[j]print("第%s趟排序后的结果:%s" % (i, li))  # !!!l1 = list(map(int, (input().split())))  # 用户输入列表
bubble_sort(l1)
print("最终排序结果:", l1)  # 输出最后的排序结果# 输入:
7 4 2 1
# 结果:
第0趟排序后的结果:[4, 2, 1, 7]
第1趟排序后的结果:[2, 1, 4, 7]
第2趟排序后的结果:[1, 2, 4, 7]
最终排序结果: [1, 2, 4, 7]

可知,三趟下来,列表就拍好序了,所以,n个数,一共需要排n-1趟。

效果图:

(2)排成降序:只需要把上面 > 改成 <  

def bubble_sort(li):for i in range(len(li) - 1):  # 总共要循环n-1趟for j in range(len(li) - 1 - i):  # 每趟里,依次比较相邻的两个数if li[j] < li[j + 1]:  # !!!排成降序li[j], li[j + 1] = li[j + 1], li[j]print("第%s趟排序后的结果:%s" % (i, li))  # !!!l1 = list(map(int, (input().split())))  # 用户输入列表
bubble_sort(l1)
print("最终排序结果:", l1)  # 输出最后的排序结果# 输入:1 3 5 7# 结果:
第0趟排序后的结果:[3, 5, 7, 1]
第1趟排序后的结果:[5, 7, 3, 1]
第2趟排序后的结果:[7, 5, 3, 1]
最终排序结果: [7, 5, 3, 1]
!!优化2:上面代码有一个弊端,例如:现对[5, 6, 7, 1,2, 3]进行排序
def bubble_sort(li):for i in range(len(li) - 1):  # 总共要循环n-1趟for j in range(len(li) - 1 - i):  # 每趟里,依次比较相邻的两个数if li[j] > li[j + 1]:li[j], li[j + 1] = li[j + 1], li[j]print("第%s趟排序后的结果:%s" % (i, li))  # !!!l1 = list(map(int, (input().split())))  # 用户输入列表
bubble_sort(l1)
print("最终排序结果:", l1)  # 输出最后的排序结果# 输入:5 6 7 1 2 3
# 结果:
第0趟排序后的结果:[5, 6, 1, 2, 3, 7]
第1趟排序后的结果:[5, 1, 2, 3, 6, 7]
第2趟排序后的结果:[1, 2, 3, 5, 6, 7]
第3趟排序后的结果:[1, 2, 3, 5, 6, 7]
第4趟排序后的结果:[1, 2, 3, 5, 6, 7]
最终排序结果: [1, 2, 3, 5, 6, 7]

 可以看到:

第0趟排序后的结果:[5, 6, 1, 2, 3, 7]
第1趟排序后的结果:[5, 1, 2, 3, 6, 7]
第2趟排序后的结果:[1, 2, 3, 5, 6, 7]
第3趟排序后的结果:[1, 2, 3, 5, 6, 7]
4趟排序后的结果:[1, 2, 3, 5, 6, 7]
最终排序结果: [1, 2, 3, 5, 6, 7]

        其实,第三趟排序完,列表已经排好了,但是这里又多排了第4趟,这就是它的弊端,所以代码可以进行优化,一趟下来,如果没有元素发生交换,则说明,列表已排好序,直接输出即可

具体做法:加个标志位。

def bubble_sort(li):for i in range(len(li) - 1):  # 总共要循环n-1趟tag = False  # !!!for j in range(len(li) - 1 - i):  # 每趟里,依次比较相邻的两个数if li[j] > li[j + 1]:li[j], li[j + 1] = li[j + 1], li[j]tag = True  # !!!print("第%s趟排序后的结果:%s" % (i, li))  # !!!if not tag:  # !!!returnl1 = list(map(int, (input().split())))  # 用户输入列表
bubble_sort(l1)
print("最终排序结果:", l1)  # 输出最后的排序结果# 输入:5 6 7 1 2 3
# 结果:
第0趟排序后的结果:[5, 6, 1, 2, 3, 7]
第1趟排序后的结果:[5, 1, 2, 3, 6, 7]
第2趟排序后的结果:[1, 2, 3, 5, 6, 7]
第3趟排序后的结果:[1, 2, 3, 5, 6, 7]
最终排序结果: [1, 2, 3, 5, 6, 7]

可见,此时第4趟没有了。

注解:

def bubble_sort(li):for i in range(len(li) - 1):  # 总共要循环n-1趟tag = Falsefor j in range(len(li) - 1 - i):  # 每趟里,依次比较相邻的两个数if li[j] > li[j + 1]:li[j], li[j + 1] = li[j + 1], li[j]tag = Trueif not tag:returnl1 = list(map(int, (input().split())))  # 用户输入列表
bubble_sort(l1)
print("最终排序结果:", l1)  # 输出最后的排序结果# 输入:5 6 7 1 2 3
# 结果:
最终排序结果: [1, 2, 3, 5, 6, 7]

逻辑运算符:not的用法:not就是取反

例1:

tag = True
print(not tag)  # not就是取反# 结果:
False

例2:

tag = Trueif not tag:   print(tag)
# 结果: 控制台什么都没有进程已结束,退出代码 0
解释:if not tag:

if 是条件判断语句,如果要执行 if 下面的代码,说明 if 后面的东西是 True。

而这里 tag = True ,  not tag就是False

整条判断语句就是  if False,说明 if 后面的东西是False,所以if 下面的代码就不会执行,这里也就不会输出tag的值了。

改下:改成 tag = False

tag = False
print(not tag)
if not tag:   # not tag=True,这句话就是if True: 式子成立print(tag)# 结果:
True
False

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

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

相关文章

自编码器 AutoEncoder

自编码器&#xff08;AutoEncoder&#xff09;&#xff0c;也称自编码模型&#xff0c;是一种基于无监督学习的数据维度压缩和特征表示方法&#xff0c;目的是对一组数据学习出一种表示。1986年 Rumelhart 提出自编码模型用于高维复杂数据的降维。由于自动编码器通常应用于无监…

〖大前端 - 基础入门三大核心之JS篇(51)〗- 面向对象之认识上下文与上下文规则

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

web漏洞原理与防御策略,web漏洞怎么挖掘

目录 Web安全的重要性 ​编辑常见的Web漏洞类型及其原理&#xff1a; 1、跨站脚本攻击&#xff08;XSS&#xff09;: 2、SQL注入: 3、跨站请求伪造&#xff08;CSRF&#xff09;: 4、远程文件包含&#xff08;RFI&#xff09;和本地文件包含&#xff08;LFI&#xff09;:…

ONLYOFFICE协作空间2.0:文档协作更便捷

〇、前言 大家好我是陈橘又青&#xff0c;在之前的文章中&#xff0c;我向大家介绍了ONLYOFFICE&#xff1a;免费、开源、跨平台的办公神器&#xff0c;想必大家都已经了解到了ONLYOFFICE在企业办公、文档处理工作中的方便快捷。ONLYOFFICE 2.0版本也已于近日更新。 今天就来跟…

市场全局复盘 20231211

昨日回顾&#xff1a; SELECT TOP 10000 CODE,成交额排名,净流入排名,代码,名称,DDE大单金额,涨幅,所属行业,主力净额,DDE大单净量,CONVERT(DATETIME, 最后涨停时间, 120) AS 最后涨停时间 FROM dbo.全部&#xff21;股20231208_ALL WHERE 连板天 > 1AND DDE大单净量 > …

ArcGIS无法绘制一个或多个图层

背景&#xff1a;在导入一份数据时候&#xff0c;arcmap出现无法绘制一个或多个图层的错误&#xff0c;...点数少于要素所要求的的数量&#xff0c;查阅了半天资料发现是制作数据时候拓扑关系错误造成&#xff0c;现将处理方法详细记录如下&#xff1a; 1.原数据&#xff1a; …

NSSCTF Crypto靶场练习,21-30wp

文章目录 [AFCTF 2018]你能看出这是什么加密么[LitCTF 2023]你是我的关键词(Keyworld)[NSSCTF 2022 Spring Recruit]classic[SWPUCTF 2021 新生赛]crypto4[LitCTF 2023]家人们&#xff01;谁懂啊&#xff0c;RSA签到都不会 (初级)[SWPUCTF 2021 新生赛]crypto5[LitCTF 2023]Is …

使用Microsoft Dynamics AX 2012 - 7. 库存管理

库存和仓库管理的主要职责是按数量和价值控制物料库存。若要完成此任务&#xff0c;您只能通过过帐库存交易记录来更改Dynamics AX中的库存&#xff0c;而这些交易记录之前需要在凭证中注册。 因此&#xff0c;库存中的当前数量始终是物料出库和入库交易记录的总和。大多数交易…

ChatGPT能帮助--掌握各种AI绘图工具,随意生成各类型性图像

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

google突然就发布了Gemini

一天就被刷屏了。 google发布Gemini多模态大模型&#xff0c;还发布了一个几分钟的视频&#xff0c;我相信看完视频都会说一句&#xff1a;NB。 视频可以去B站或者其他地方搜 Gemini。 感觉机器不仅有脑子了&#xff0c;还长眼睛了。 Gemini是原生多模态大模型&#xff0c;…

数据库系列之简要对比下GaussDB和OpenGauss数据库

GaussDB作为一款企业级的数据库产品&#xff0c;和开源数据库OpenGauss之间又是什么样的关系&#xff0c;刚开始接触的时候是一头雾水&#xff0c;因此本文简要对比下二者的区别&#xff0c;以加深了解。 1、GaussDB和OpenGauss数据库简要对比 GaussDB是华为基于PostgreSQL数据…