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. Netty实战八之引导

    通过前面的学习,我们可能要考虑一个问题:如何将这些部分组织起来,成为一个可实际运行的应用程序呢? 答案是引导.简单来说,引导一个应用程序是指对它进行配置,并使它运行起来的过程——尽管该过程的具体细节可 ...

  2. next.js学习笔记

    github地址: https://github.com/zeit/next.js#fetching-data-and-component-lifecycle 简介 Next.js是一个用于React ...

  3. es6 语法 (Decorator)

    修饰器是一个函数,用来修改类的行为(注意:1.函数  2.修改行为  3.对类进行操作) { //修饰器函数定义 target:类本身,name名称,descriptor描述 let readonly ...

  4. vue从入门到进阶:渲染函数 & JSX(八)

    Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接 ...

  5. vivo怎么录屏 手机录制屏幕详细教程

    在手机上我们经常可以刷到许多类似于手机游戏之类的屏幕视频我想肯定会有很多人好奇怎么录制的,今天小编所说的便是教大家如何在安卓手机上进行屏幕录像,下面便是关于vivo怎么录屏的具体操作方法,希望能对你们 ...

  6. Android为TV端助力 MediaPlayer API大全已经方法详解(转载)

    通过这张图,我们可以知道一个MediaPlayer对象有以下的状态: 1)当一个MediaPlayer对象被刚刚用new操作符创建或是调用了reset()方法后,它就处于Idle状态.当调用了rele ...

  7. 让bind函数支持IE8浏览器的方法

    bind函数在IE8下是不支持的,只需要在你的js文件中加入如下代码就可以支持IE8 //让bind函数支持IE8 if (!Function.prototype.bind) { Function.p ...

  8. python爬虫从入门到放弃(九)之 Requests+正则表达式爬取猫眼电影TOP100

    import requests from requests.exceptions import RequestException import re import json from multipro ...

  9. 章节四、4-For循环

    一.For循环格式 package introduction5; public class ForLoopDemo { public static void main(String[] args) { ...

  10. CSS之表格边框合并、兄弟标签外边距合并、父子标签的外边距合并

    本文内容: 表格边框合并 兄弟标签外边距合并 父子标签的外边距合并 首发日期:2018-05-01 表格边框合并: 发生情况: 当设置了cellpadding="0" cellsp ...