第三课 排序算法LowB三人组
python数据结构与算法基础 第三课
tags:
- python
- 路飞学院
categories:
- python
- 排序算法
- LowB 三人组
- 冒泡排序
- 选择排序
- 插入排序
文章目录
- python数据结构与算法基础 第三课
- 第一节 什么是列表排序
- 1. 列表排序介绍
- 第二节 冒泡排序
- 1. 冒泡排序原理和实现
- 2. 冒泡排序改进和分析
- 第三节 选择排序
- 1. 选择排序原理和实现
- 2. 选择排序改进和分析
- 第四节 插入排序
- 1. 插入排序原理和实现
第一节 什么是列表排序
1. 列表排序介绍
- 排序:将一组“无序”的记录序列调整为“有序”的记录序列
- 列表排序:将无序列表变为有序列表。
- 输入:列表 输出:有序列表
- 升序与降序
- 内置排序函数: sort()
- 榜单、红黑榜、使用网站评率等
- 常见的排序算法如下
排序LowB三人组 | 排序NB三人组 | 其他排序 |
---|---|---|
冒泡排序 | 快速排序 | 希尔排序 |
选择排序 | 堆排序 | 计数排序 |
插入排序 | 归并排序 | 基数排序 |
第二节 冒泡排序
1. 冒泡排序原理和实现
- 列表每两个相邻的数,如果前面比后面大,则交换这两个数。
- 一趟排序完成后,则无序区减少一个数,有序区增加一个数。
- 代码关键点:趟、无序区范围
#!/usr/bin/env python3# 冒泡排序def bubble_sort(li):# 整个列表的循环是n-1趟# i=0 第一趟 无需区 len(li)-1# i=1 第二趟 无需区 len(li)-1-1# i=n-1 第n-1趟 无需区 len(li)-1-(n-1)# 第i趟 无序区的长度为len(li)-1-ifor i in range(len(li)-1):for k in range(len(li)-1-i):if li[k] > li[k+1]:li[k], li[k+1] = li[k+1], li[k]import randomlist = random.sample([i for i in range(1000)], 20)print(list)bubble_sort(list)print(list)
2. 冒泡排序改进和分析
- 时间复杂度: O(n^2)
- 如果一趟中列表排序中没有发生任何交换,我们可以认为列表已经是有序的了
- 可以加个标志位
#!/usr/bin/env python3# 冒泡排序改进def bubble_sort_impro(li):for i in range(len(li)-1):exchange = Falsefor k in range(len(li)-1-i):if li[k] > li[k+1]:li[k], li[k+1] = li[k+1], li[k]exchange = Trueif not exchange:returnimport randomlist1= [random.randint(0,1000) for i in range(20)]print(list1)bubble_sort_impro(list1)print(list1)
第三节 选择排序
1. 选择排序原理和实现
- 每次从列表中选出最小的数放到一个新列表中
- 时间复杂度: O(n^2)
#!/usr/bin/env python3# 简单版选择排序def select_sort(li):li_new = []for i in range(len(li)):# 有重复的也没关系,会从左边找# min是0(n) remove是一个O(n)min_val = min(li)li_new.append(min_val)li.remove(min_val)return li_newimport randomlist = random.sample([i for i in range(1000)], 20)print(list)li_new = select_sort(list)print(li_new)
2. 选择排序改进和分析
- 上述选择排序多占用了一份内存。空间复杂度变成2*n。
- 这不是必要的可以进行改进,避免掉
- 我把选择的出的数放在最前面的位置就可以了。最前面的数和选出的数交换
- 算法关键点:有序区和无序区、无序区最小数的位置
- 时间复杂度: O(n^2)
#!/usr/bin/env python3# 改进版选择排序def select_sort_impro(li):for i in range(len(li)-1):# 假设最小值是无序区的第一个位置min_loc = i# 可以偷次懒 i 不需要和自己比拉for j in range(i+1, len(li)):if li[j] < li[min_loc]:min_loc = jli[i], li[min_loc] = li[min_loc], li[i]import randomlist1= [random.randint(0,1000) for i in range(20)]print(list1)select_sort_impro(list1)print(list1)
第四节 插入排序
1. 插入排序原理和实现
- 初始时手里(有序区)只有- -张牌
- 每次(从无序区)摸一-张牌,插入到手里已有牌的正确位置
#!/usr/bin/env python3# 插入排序def insert_sort(li):for i in range(1, len(li)): # i表示摸到的牌temp = li[i]j = i - 1 # j表示有序区的最后一张牌(手里的牌)while j >= 0 and li[j] > temp:li[j + 1] = li[j]j -= 1li[j + 1] = tempimport randomlist = random.sample([i for i in range(1000)], 20)print(list)insert_sort(list)
第三课 排序算法LowB三人组相关推荐
- 排序算法lowb三人组-插入排序
排序算法lowb三人组-插入排序 def insert_sort(li):for i in range(1, len(li)): # i表示摸到的牌的下标tmp = li[i] # 摸到的牌j = i ...
- 面试前你必须知道的三个排序算法
今天分享的是三种排序算法,在面试.实际编程中经常会碰到和使用到的,我会带领大家从分析排序算法技巧上以及代码实现上全面理解这一知识点的掌握. 一.如何分析一个「排序算法」 1. 执行效率 ① 最好.最坏 ...
- Java学习 第三章 数组(三)排序算法
** Java学习 第三章 数组(三)排序算法 ** 主要内容:排序算法.排序算法横向比较.Arrays工具类的使用.数组常见异常 1.数组中涉及到的常见算法:排序算法 1.1 排序算法分类:内部排序 ...
- [ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序
手撕排序算法系列之:希尔排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...
- 死磕算法第三弹——排序算法(1)
本文整理来源 <轻松学算法--互联网算法面试宝典>/赵烨 编著 算法基础 对于算法性能分析来说,除了时间复杂度,还是有空间复杂度.稳定性等指标.而我们平时说的算法的复杂度可以分为两个部分: ...
- 9个元素换6次达到排序序列_一文带你读懂排序算法(三):堆排序算法
国庆节快乐~点击上方文字关注我们哦 堆是一种特殊的树形数据结构,其每一个结点都有一个值,通常提到的堆都是指一棵完全二叉树,根结点的值小于(或大于)两个子结点的值,同时,根结点的两个子树也分别是一个堆. ...
- java 实现 常见排序算法(三)快速排序
大家好,我是烤鸭: 今天分享一下基础排序算法之快速排序.快速排序是内部排序(基于比较排序)中最好的比较算法. 1. 快速排序: 原理:在要排的数(比如数组A)中选择一个中心值key(比如A[0 ...
- 图解排序算法(三)之堆排序
预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序.首先简单了解下堆结构. 堆 堆是具有以下性 ...
- 排序算法(三)—— 插入法排序算法
1.插入法排序算法介绍 插入法是一个比较常用的排序方法.插入法排序的思路就是将要排序的数组分两个区间,一个是已排序区间,一个是未排序区间.初始时,默认第一个元素是已排序区间的,后面的所有元素为未排序区 ...
- 【排序算法(三)】直接插入排序及其改进
基本思想 直接插入排序是一种简单且有效的比较排序算法,在每次迭代过程中选取未排序序列的第一个元素,并将该元素插入左侧已排序序列的正确位置,重复该过程,直到所有输入元素都被选择一次. 对于数组 {3, ...
最新文章
- 用结构体实现一个电话本
- Android之给图片去色,返回灰度图片以及ColorMatrix中setSaturation方法的用法
- mitmproxy配置代理后 APP连接不到网络 XPosed安装
- linux如何把nfs数据导出来,linux – NFS导出已经挂载NFS的目录(在服务器上)
- 重启docker 服务命令
- 图像拼接2 特征匹配
- mvp模式 php,Hyper-V - 增强会话模式
- 计算机失误,计算机做题的易出现的失误
- SPSS数据分析之描述性统计、区间估计与假设检验【操作详解】
- 利用Python求阶乘
- Ubuntu下LDAP 部署文档
- Java对Internet为什么这么重要?
- install mysql with source code
- ntpdate[16603]: the NTP socket is in use
- 微信公众号文章采集的几种方案
- Xxx饭堂系统 JAVA+SQL+JDBC完成一个小项目(下篇)
- 大学英语B-必考词汇400个
- MT5和MT4交易软件有什么区别?
- 宝塔实测-搭建LightPicture开源图床系统
- 机顶盒CM311-1a的EMMC各分区范围
热门文章
- leetcode 155. Min Stack最小栈(中等)
- audio音频使用天坑
- 教程:如何申请公众号和创建公众号?
- Hyper-v 实现与虚拟机共享文件夹
- Codeforces Round 701 Multiples and Power Differences
- R绘图基础指南 | 1.条形图
- samba介绍、搭建及坑
- 高清多媒体接口(HDMI)静电防护器件ULC0524PA
- mysqld: [ERROR] Found option without preceding group in config file my.ini at line 1
- FedEx v20.0.7654的CData驱动程序