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)的更多相关文章

  1. 冒泡排序、选择排序、直接插入排序、快速排序、折半查找>从零开始学JAVA系列

    目录 冒泡排序.选择排序.直接插入排序 冒泡排序 选择排序 选择排序与冒泡排序的注意事项 小案例,使用选择排序完成对对象的排序 直接插入排序(插入排序) 快速排序(比较排序中效率最高的一种排序) 折半 ...

  2. c/c++ 算法之快速排序法 冒泡排序法,选择排序法,插入排序法

    本文详细叙述和实现了快速排序算法,冒泡排序 选择排序 插入排序比较简单,原理在这里不再详述,直接用代码进行了实现. 快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定), ...

  3. c语言:简单排序:冒泡排序法、选择排序法、插入排序法(待写)

    1.冒泡排序法: 假设有n个数需要按从小到大排序,冒泡排序的原理是,在这一排数字中,将第一个数与第二个数比较大小,如果后面的比前面的小,就将他们交换位置.然后再比较第二个和第三个,再交换,直到第n-1 ...

  4. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...

  5. php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法

    这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式 ...

  6. Python实现八大排序(基数排序、归并排序、堆排序、简单选择排序、直接插入排序、希尔排序、快速排序、冒泡排序)

    目录 八大排序 基数排序 归并排序 堆排序 简单选择排序 直接插入排序 希尔排序 快速排序 冒泡排序 时间测试 八大排序 大概了解了一下八大排序,发现排序方法的难易程度相差很多,相应的,他们计算同一列 ...

  7. 常见排序算法总结:插入排序,希尔排序,冒泡排序,快速排序,简单选择排序以及java实现

    今天来总结一下常用的内部排序算法.内部排序算法们需要掌握的知识点大概有:算法的原理,算法的编码实现,算法的时空复杂度的计算和记忆,何时出现最差时间复杂度,以及是否稳定,何时不稳定. 首先来总结下常用内 ...

  8. 算法 排序lowB三人组 冒泡排序 选择排序 插入排序

    参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一 ...

  9. java面向对象的冒泡排序,选择排序和插入排序的比较

    这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0 ...

随机推荐

  1. Centos 7.6配置nginx反向代理负载均衡集群

    一,实验介绍 利用三台centos7虚拟机搭建简单的nginx反向代理负载集群, 三台虚拟机地址及功能介绍 192.168.2.76    nginx负载均衡器 192.168.2.82    web ...

  2. Java学习笔记之——Manth类和String类

    (1) Math:常用的数学运算,都是静态方法 方法摘要 static double abs(double a) 返回 double 值的绝对值. static float abs(float a) ...

  3. virtualbox中 清理磁盘

    1. 碎片整理 windows: 下载 sdelete 工具 执行命令: sdelete –z c:\ Linux: 执行如下命令: sudo dd if=/dev/zero of=/EMPTY bs ...

  4. Java编程思想__异常

    1.使用异常链,需要采用如下方式包装捕获到的异常: public void two() { System.out.println("two()"); try { one(); } ...

  5. Js 转动抽奖实现

    一.样本 地址:http://js.zhuamimi.cn/choujiang/index.htm 源码:https://pan.baidu.com/s/15KhesfcLf1WMOom6PhzCjA ...

  6. 使用CSS实现无滚动条滚动

    我们都知道,撸页面的时候当我们的内容超出了我们的div,往往会出现滚动条,影响美观. 尤其是当我们在做一些导航菜单的时候.滚动条一出现就破坏了UI效果. 我们不希望出现滚动条,也不希望超出去的内容被放 ...

  7. Java NIO 学习

    Java NIO提供了与标准IO不同的IO工作方式: Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(B ...

  8. Linux 安装 jdk8

    切换目录 cd /usr 创建目录 mkdir java cd java 下载 jdk rz 或者 ftp 都行,只要能成功上传 解压 tar zxvf jdk-8u181-linux-x64.tar ...

  9. Python 标准类库-日期类型之datetime模块

    标准类库-日期类型之datetime模块    by:授客 QQ:1033553122 可用类型 3 实践出真知 4 timedelta对象 4 class datetime.timedelta(da ...

  10. Android为TV端助力 史上最简单易懂的跨进程通讯(Messenger)!

    不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递m ...