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. 47.Linux-DEVICE_ATTR()介绍及使用示例

    1.介绍 使用DEVICE_ATTR,可以实现驱动在sys目录自动创建文件,我们只需要实现show和store函数即可. 然后在应用层就能通过cat和echo命令来对sys创建出来的文件进行读写驱动设 ...

  2. mybatis_06SQL片段

    个人概要: SQL片段在使用if where的基础上,将if,where语句装到SQL标签内,在数据库操作元素内引用 Mybatis提供了SQL片段的功能,可以提高SQL的可重用性. <!--声 ...

  3. virtualbox中设置u盘启动

    1.在磁盘管理中查看u盘的磁盘号X 2.管理员运行cmd,进入virtualbox目录 3.运行命令: VBoxManage internalcommands createrawvmdk -filen ...

  4. 自动化运维经验谈,以及为什么Docker是革命性的

    互联网+的需要 在信息越来越繁杂的互联网时代,公司所运行的项目越来越多,项目相关服务繁多,服务之间存在复杂的依赖关系,运维与管理任务越来越繁重,手工交付需要花费很多的人力与时间,且安全性和时效性均无法 ...

  5. 发生服务器错误: Error loading MySQLdb module: libmysqlclient.so.18: cannot open shared object file: No such file or directory

    在hue上配置Mysql的时候,出现的错误:  发生服务器错误: Error loading MySQLdb module: libmysqlclient.so.18: cannot open sha ...

  6. vue-cli中安装方法

    源:http://www.cnblogs.com/jn1223/p/6656956.html vue-cli中安装方法   vue-cli脚手架模板是基于node下的npm来完成安装的所以首先需要安装 ...

  7. loj#6033. 「雅礼集训 2017 Day2」棋盘游戏(二分图博弈)

    题意 链接 Sol 第一次做在二分图上博弈的题..感觉思路真是清奇.. 首先将图黑白染色. 对于某个点,若它一定在最大匹配上,那么Bob必胜.因为Bob可以一直沿着匹配边都,Alice只能走非匹配边. ...

  8. mysql安装完成之后为root用户添加密码

    编辑MySql的配置文件:my.ini(在MySql安装目录下). 打开配置文件,在文件最后一行添加:skip-grant-tables,然后保存退出. 意思为就是在启mysql时不启动grant-t ...

  9. error 2593 operator << 不明确的可能的解决方法

    编译Martinez算法时遇到该问题,提示重载的<<操作符调用不明确. 解决方法为:在cpp文件中将重载的该操作符的实现前添加完整的命名空间路径.

  10. Scrapy 为每一个Spider设置自己的Pipeline

    settings中的ITEM_PIPELINES 通常我们需要把数据存在数据库中,一般通过scrapy的pipelines管道机制来实现.做法是,先在pipelines.py模块中编写Pipeline ...