冒泡排序 最好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 ...
随机推荐
- Java学习笔记之——自动装箱与拆箱
自动装箱与拆箱 基本类型与引用类型的互相转换 1. 基本类型对应的包装类 byte short char int long flaot double ...
- JS 操作svg画图
背景: 一共有3个文件:svg文件,html文件,js文件. 有一个svg图,使用embed标签,引入到了html文件中 svg文件: <svg width="640" he ...
- Your local changes to the following files would be overwritten by merge:
在服务器改动之后,用sourcetree提交会产生冲突,解决办法:
- JavaScript之Object对象常用属性与方法手册
MDN Object参考地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Obje ...
- window.requestAnimationFrame与Tween.js配合使用实现动画缓动效果
window.requestAnimationFrame 概述 window.requestAnimationFrame()这个方法是用来在页面重绘之前,通知浏览器调用一个指定的函数,以满足开发者操作 ...
- Django之django模型层一单表操作
一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...
- android开发——Android开发中的47个小知识
1.判断sd卡是否存在 boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environme ...
- 基于OpenSSL的HTTPS通信C++实现
HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL.Nebula是一个为开发者提供一个快速开发 ...
- Java 一些知识点总结
本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺(阅读本文需要有一定的Java基础).本文的 ...
- 智能POS相关FAQ
1.安卓智能POS(一体机)的口碑点餐已知问题: 1.由于口碑的组合套餐接口不稳定,强烈建议商户不要使用组合套餐商品.已开通口碑后付的门店,如果有组合套餐商品,暂时不要使用组合套餐商品:有组合套餐需求 ...