[DS+Algo] 005 三种简单排序及其代码实现
- 不妨默认将对象升序排序
1. 冒泡排序 BubbleSort
1.1 算法描述
- 从前向后,依次比较相邻的元素,若前一个比后一个大,就对它俩做交换
- 对每一对相邻元素作同样的工作,从头一对到最后一对
- 做完一轮后,最后的元素就是最大的数
- 针对所有的元素重复以上的步骤,除了最后排完序的
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
1.2 性能分析
最优时间复杂度:O(n)
- 表示遍历一次发现没有任何可以交换的元素,排序结束
最坏时间复杂度:0(n2)
稳定性:稳定
1.3 Python 代码实现
from random import randrange
def bubble_sort(lst):
for j in range(len(lst)-1, 0, -1):
for i in range(j):
if lst[i+1] < lst[i]:
lst[i+1], lst[i] = lst[i], lst[i+1]
if __name__ == "__main__":
lst = [randrange(10, 100) for i in range(10)]
print(">>> before sort:", lst)
bubble_sort(lst)
print(">>> after sort: ", lst)
2. 选择排序 SelectionSort
2.1 算法描述
- 在未排序序列中找到最小元素,存放到排序序列的起始位置
- 从剩余未排序元素中继续寻找最小元素,放到已排序序列的末尾
- 以此类推,直到所有元素均排序完毕
2.2 选择排序的主要优点
- 与数据移动有关
- 如果某个元素位于正确的最终位置上,则它不会被移动
- 选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上
- 对 n 个元素进行排序总共进行至多 n-1 次交换
- 所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种
2.3 性能分析
- 最优时间复杂度:O(n2)
- 最坏时间复杂度:O(n2)
- 稳定性:不稳定(考虑升序每次选择最大的情况)
2.4 Python 代码实现
from random import randrange
def selection_sort(lst):
n = len(lst)
for i in range(n-1):
min_idx = i
for j in range(i+1, n):
if lst[j] < lst[min_idx]:
min_idx = j
if min_idx != i:
lst[i], lst[min_idx] = lst[min_idx], lst[i]
if __name__ == "__main__":
lst = [randrange(10, 100) for i in range(10)]
print(">>> before sort:", lst)
selection_sort(lst)
print(">>> after sort: ", lst)
3. 插入排序 Insertion sort
- 是一种简单直观的排序算法
3.1 算法描述
对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
在插入排序的实现上
- 在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间
3.2 性能分析
- 最优时间复杂度:O(n)(当序列已经处于升序状态时)
- 最坏时间复杂度:O(n2)
- 稳定性:稳定
3.3 Python 代码实现
from random import randrange
def insert_sort(lst):
for i in range(1, len(lst)):
for j in range(i, 0, -1):
if lst[j] < lst[j-1]:
lst[j], lst[j-1] = lst[j-1], lst[j]
if __name__ == "__main__":
lst = [randrange(10, 100) for i in range(10)]
print(">>> before sort:", lst)
insert_sort(lst)
print(">>> after sort: ", lst)
[DS+Algo] 005 三种简单排序及其代码实现的更多相关文章
- [DS+Algo] 006 两种简单排序及其代码实现
目录 1. 快速排序 QuickSort 1.1 步骤 1.2 性能分析 1.3 Python 代码示例 2. 归并排序 MergeSort 2.1 步骤 2.2 性能分析 2.3 Python 代码 ...
- c语言实现基本的数据结构(二) 链表(包括链表的三种简单排序算法)
#include "stdafx.h" #include <stdlib.h> //创建一个节点,data为value,指向NULL Node* Create(int ...
- 三种简单排序算法(java实现)
一.冒泡排序 算法思想:遍历待排序的数组,每次遍历比较相邻的两个元素,如果他们的排列顺序错误就交换他们的位置,经过一趟排序后,最大的元素会浮置数组的末端.重复操 作 ...
- JS三种简单排序算法
冒泡排序:最简单.最慢.长度小于7的时候最优 插入排序:比冒泡要快比快速排序和希尔排序慢,数据量小的时候优势大 快速排序:速度很快 //js利用systemSort进行排序 systemSort: ...
- iOS开发UI篇—iOS开发中三种简单的动画设置
iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...
- 三种简单的html网页自动跳转方法
三种简单的html网页自动跳转方法,可以让你在打开一个html网页时自动跳转到其它的页面. 方法/步骤 <html> <head> <title>正在跳转< ...
- 表单模糊查询的三种简单方式(springboot-h2-mybatis)
前几天运营提到说后台管理系统有几个地方想要模糊查询.. 想了下是简单的,就是要注意以前方法的被调用情况,进行增量改动,以免牵一发而动全身.整理一波记录下(本次案例是按名字模糊查询学生信息). 三种 ...
- <算法基础><排序>三种高级排序——快速排序,堆排序,归并排序
这三种排序算法的性能比较如下: 排序名称 时间复杂度(平均) 时间复杂度(最坏) 辅助空间 稳定性 快速排序 O(nlogn) O(n*n) O(nlogn) 不稳定 堆排序 O(nlogn) O(n ...
- WPF之Binding的三种简单写法
环境 类代码 public class Person:INotifyPropertyChanged { private string name; public string Name { get { ...
随机推荐
- Python条件控制与循环
条件控制语句:if 循环语句:while.for 其他语句:continue.break.pass 1.if语句 # ================================ a = 1 if ...
- AQS源码分析笔记
经过昨晚的培训.对AQS源码的理解有所加强,现在写个小笔记记录一下 同样,还是先写个测试代码,debug走一遍流程, 然后再总结一番即可. 测试代码 import java.util.concurre ...
- 参数类型*&是什么意思?
前两天摸鱼聊天的时候遇到一个问题,一个链表的函数中,有一个参数显得很奇怪 (大概是一个样子的)ListNode<T>*& l 这个参数l除了用了一个*之外还用了一个&,直觉 ...
- 使用jquery给html标签加点击事件
//直接给所有img标签绑定click事件 $("img").click(function(){ alert('你点击了图片'); }) //使用bind方法绑定click事件 $ ...
- UVa 1601 || POJ 3523 The Morning after Halloween (BFS || 双向BFS && 降维 && 状压)
题意 :w*h(w,h≤16)网格上有n(n≤3)个小写字母(代表鬼).要求把它们分别移动到对应的大写字母里.每步可以有多个鬼同时移动(均为往上下左右4个方向之一移动),但每步结束之后任何两个鬼不能占 ...
- TTTTTTTTTTTTTT CDOJ Sliding Window 线段树(nlogn)或双端队列(n) 模板
题目链接: L - Sliding Window Time Limit:6000MS Memory Limit:131072KB 64bit IO Format:%lld & ...
- ZOJ 2301 离散化
题目链接: 题意是说,有从 1 开始递增依次编号的很多球,开始他们都是黑色的,现在依次给出 n 个操作(ai,bi,ci),每个操作都是把编号 ai 到 bi 区间内的所有球涂成 ci 表示的颜色(黑 ...
- Ansible跳板机自动部署
首先,安装ansible,略过此步骤. 一.控制机(jenkens.ansible所在机器与跳板机之间互信,跳板机与目的机之间互信) 1.在客户端生成公钥私钥对 命令:ssh-keygen -t rs ...
- BZOJ 2281 Luogu P2490 [SDOI2011]黑白棋 (博弈论、DP计数)
怎么SDOI2011和SDOI2019的两道题这么像啊..(虽然并不完全一样) 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?i ...
- Spark 2.1.1 源码编译
Spark 2.1.1 源码编译 标签(空格分隔): Spark Spark 源码编译 环境准备与起因 由于线上Spark On Yarn Spark Streaming程序在消费kafka 写入HD ...