冒泡排序 最好O(n)平均O(n^2) 选择排序O(n2) 插入排序O(n2)
LOWB 三人组
- 分清有序区跟无序区
冒泡排序
思路:
首先,列表每两个相邻的数,如果前边的比后边的大,那么交换和两个数....
冒泡排序优化
如果一趟没有发生任何交换 那么证明列表已经是有序的了
import random
from cal_time import cal_time # 计算时间的 装饰器
@cal_time
def bubble_sort(li):
for i in range(len(li)-1): # i表示第i趟
# 第i趟无序区位置【0,n-i-1】
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
# 优化
@cal_time
def bubble_sort_2(li):
for i in range(len(li)-1): # i表示第i趟
# 第i趟无序区位置【0,n-i-1】
exchange = False # 如果一趟没有发生任何交换 那么证明列表已经是有序的了 可以结束循环了
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
exchange = True
if not exchange:
return
# 最好情况 O(n)
# 平均情况 O(n^2)
# 最坏情况 O(n^2)
# li = [6,8,9,7,5,1,4,2,3,0]
li = list(range(10000))
#random.shuffle(li)
bubble_sort_2(li)
选择排序
- 思路:
- 一趟便利记录最小的数,放到第一个位置;
- 再一趟便利记录剩余列表中最小的数,继续放置;
- 选出最小的数?
import random
from cal_time import cal_time
# 获取最小值的函数
def find_min(li):
min_num = li[0] #
for i in range(1, len(li)):
if li[i] < min_num:
min_num = li[i]
return min_num
# 找最小值的下标
def find_min_pos(li):
min_pos = 0
for j in range(1, len(li)):
if li[j] < li[min_pos]:
min_pos = j
return min_pos
# 选择排序
@cal_time
def select_sort(li):
for i in range(len(li)-1): # 第i趟
# 第i趟 无序区【i, len(li)-1】
# 找无序区最小数位置,和无序区第一个数交换
min_pos = i # 最小值的下标
for j in range(i+1, len(li)):
if li[j] < li[min_pos]:
min_pos = j
li[min_pos], li[i] = li[i], li[min_pos]
# print(li)
# li = [5,7,8,4,1,6,2,9,3,0]
# print(li)
li = list(range(10000))
random.shuffle(li)
select_sort(li)
# 时间复杂度: O(n2)
# 空间复杂度:
- 优化
def select_sort(li):
count = len(li)
for i in range(count // 2):
min_index = i
if li[min_index] > li[min_index + 1]:
li[min_index + 1], li[min_index] = li[min_index], li[min_index + 1]
max_index = count - i - 1
for j in range(i + 1, count - i):
if li[min_index] > li[j]:
min_index = j
if li[max_index] < li[j]:
max_index = j
if min_index != i:
li[i], li[min_index] = li[min_index], li[i]
if max_index != count - i - 1:
li[count - i - 1], li[max_index] = li[max_index], li[count - i - 1]
插入排序
思路:
列表被分为有序区和无序区两个部分.最初有序区只有一个元素
每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空.
import random
from cal_time import cal_time
@cal_time
def insert_sort(li):
for i in range(1, len(li)): # i表示第i趟,还表示摸到的牌的位置
tmp = li[i] # 取出要判断的数值
j = i - 1 # 被判断的数值位置
# and 前边为退出循环条件 后边为 逻辑判断
while j >= 0 and li[j] > tmp: # and 左右不能换
li[j + 1] = li[j] # 前面的数大于后面的数 将数值向后移动一位
j -= 1 # 判断的位置向前移动一位 会出现 负数 加循环终止条件
li[j + 1] = tmp # 将取出的数值放回空缺的位置
# li = [5,7,8,4,1,6,2,9,3,0]
# print(li)
li = list(range(10000))
random.shuffle(li)
insert_sort(li)
# 时间复杂度: O(n2)
# 空间复杂度:
# def test(li):
# i = 0
# # i < len(li) 判断是否 索引越界
# while i < len(li) and li[i] > 0:
# i += 1
# if i < len(li):
# return li[i]
# else:
# return None
#
# li = [3,5,7,8,9,5]
# print(test(li))
# 补充:布尔语句的短路功能
# 0 and 7
# 2 and 1
# 1 and 0
# 0 or 4
# 3 or 5
# def foo(x):
# x <= 0 or print('abc')
#
# foo(4)
冒泡排序 最好O(n)平均O(n^2) 选择排序O(n2) 插入排序O(n2)的更多相关文章
- 冒泡排序、选择排序、直接插入排序、快速排序、折半查找>从零开始学JAVA系列
目录 冒泡排序.选择排序.直接插入排序 冒泡排序 选择排序 选择排序与冒泡排序的注意事项 小案例,使用选择排序完成对对象的排序 直接插入排序(插入排序) 快速排序(比较排序中效率最高的一种排序) 折半 ...
- c/c++ 算法之快速排序法 冒泡排序法,选择排序法,插入排序法
本文详细叙述和实现了快速排序算法,冒泡排序 选择排序 插入排序比较简单,原理在这里不再详述,直接用代码进行了实现. 快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定), ...
- c语言:简单排序:冒泡排序法、选择排序法、插入排序法(待写)
1.冒泡排序法: 假设有n个数需要按从小到大排序,冒泡排序的原理是,在这一排数字中,将第一个数与第二个数比较大小,如果后面的比前面的小,就将他们交换位置.然后再比较第二个和第三个,再交换,直到第n-1 ...
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
- php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法
这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式 ...
- Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)
目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...
- 常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现
今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...
- 算法 排序lowB三人组 冒泡排序 选择排序 插入排序
参考博客:基于python的七种经典排序算法 [经典排序算法][集锦] 经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一 ...
- java面向对象的冒泡排序,选择排序和插入排序的比较
这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换 0 ...
随机推荐
- SQL Server 分页编号的另一种方式
今天看书讲T-SQL,看到了UNBOUNDED PRECEDING,就想比对下ROW_NUMBER()的运行速度. sql及相关的结果如下,数据库中的数据有5W+. ROW_NUMBER(): SET ...
- VS2015 项目中 添加windows服务
1. 在项目中添加winows服务 今天刚刚为自己的项目添加了windows服务,以服务的形式运行后台系统,为前端提供接口服务,下面说一下具体怎么为vs项目添加windows服务 2. 添加Windo ...
- VS2017 启动调试出现 无法启动程序“http://localhost:15613” 操作在当前状态中是非法的。 同时附加进程也是错误的解决方法
第一次发表这样的博客,不会如何的排版,还有很多的不懂,大神勿喷哈! 同时是给自己做的一次记录,已方便后面可能会同样出现该问题后不用像无头苍蝇一样到处百度乱找 VS2017 启动调试出现 无法启动程序 ...
- PHP stdClass类
stdClass 是 PHP 的一个基类,几乎所有的类都继承了这个类,所以任何时候都可以被 new,让这个变量成为一个 Object.同时,实例化之后的 stdClass 是没有任何属性和方法的,也就 ...
- struts2_Action的三种实现方式
1.普通java类 package com.ahd.action; public class HelloAction{ public String execute() throws Exception ...
- Java 学习笔记 反射与迭代器
反射 使用反射获得类 Class cls = Class.forName("全类名") //包括包名 Class cls = xx.Class;//xx代表类名 使用反射获得构造方 ...
- 【Java每日一题】20170118
20170117问题解析请点击今日问题下方的“[Java每日一题]20170118”查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; import jav ...
- Unix awk的流程控制BEGIN和END的讲解
你可能对Unix比较熟悉,但你可能对Unix awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度. 流程控制语句是任何程序设计语言都不能缺少的部分.任何好的语言都有 ...
- 我是这样搞懂一个神奇的BUG
摘要: 通过分析用户的行为,才想得到为什么会出现这种情况! 前两天在BearyChat收到这样的一个报警消息: 409 ?Conflict ? 平时很少遇到这样的错误,貌似很严重的样子,吓得我赶紧查看 ...
- 百度前端学院-基础学院-第20到21天之setTimeOut与setInterval
setTimeout()可以使用clearTimeout()关闭 setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭. 注意:setInterv ...