• 不妨默认将对象升序排序

1. 冒泡排序 BubbleSort

1.1 算法描述

  1. 从前向后,依次比较相邻的元素,若前一个比后一个大,就对它俩做交换
  2. 对每一对相邻元素作同样的工作,从头一对到最后一对
  3. 做完一轮后,最后的元素就是最大的数
  4. 针对所有的元素重复以上的步骤,除了最后排完序的
  5. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

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 算法描述

  1. 在未排序序列中找到最小元素,存放到排序序列的起始位置
  2. 从剩余未排序元素中继续寻找最小元素,放到已排序序列的末尾
  3. 以此类推,直到所有元素均排序完毕

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 三种简单排序及其代码实现的更多相关文章

  1. [DS+Algo] 006 两种简单排序及其代码实现

    目录 1. 快速排序 QuickSort 1.1 步骤 1.2 性能分析 1.3 Python 代码示例 2. 归并排序 MergeSort 2.1 步骤 2.2 性能分析 2.3 Python 代码 ...

  2. c语言实现基本的数据结构(二) 链表(包括链表的三种简单排序算法)

    #include "stdafx.h" #include <stdlib.h> //创建一个节点,data为value,指向NULL Node* Create(int ...

  3. 三种简单排序算法(java实现)

    一.冒泡排序 算法思想:遍历待排序的数组,每次遍历比较相邻的两个元素,如果他们的排列顺序错误就交换他们的位置,经过一趟排序后,最大的元素会浮置数组的末端.重复操                   作 ...

  4. JS三种简单排序算法

    冒泡排序:最简单.最慢.长度小于7的时候最优 插入排序:比冒泡要快比快速排序和希尔排序慢,数据量小的时候优势大 快速排序:速度很快  //js利用systemSort进行排序 systemSort: ...

  5. iOS开发UI篇—iOS开发中三种简单的动画设置

    iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...

  6. 三种简单的html网页自动跳转方法

    三种简单的html网页自动跳转方法,可以让你在打开一个html网页时自动跳转到其它的页面. 方法/步骤   <html> <head> <title>正在跳转< ...

  7. 表单模糊查询的三种简单方式(springboot-h2-mybatis)

    前几天运营提到说后台管理系统有几个地方想要模糊查询..   想了下是简单的,就是要注意以前方法的被调用情况,进行增量改动,以免牵一发而动全身.整理一波记录下(本次案例是按名字模糊查询学生信息). 三种 ...

  8. <算法基础><排序>三种高级排序——快速排序,堆排序,归并排序

    这三种排序算法的性能比较如下: 排序名称 时间复杂度(平均) 时间复杂度(最坏) 辅助空间 稳定性 快速排序 O(nlogn) O(n*n) O(nlogn) 不稳定 堆排序 O(nlogn) O(n ...

  9. WPF之Binding的三种简单写法

    环境 类代码 public class Person:INotifyPropertyChanged { private string name; public string Name { get { ...

随机推荐

  1. java数据结构4--集合Set

    Set接口 Set接口用来表示:一个不包含“重复元素”的集合Set接口中并没有定义特殊的方法,其方法多数都和Collection接口相同. 重复元素的理解:通常理解:拥有相同成员变量的对象称为相同的对 ...

  2. 软件的三大类型-单机类型、BS类型、CS类型

    单机类型:最开始的软件就是那些不需要联网的单机软件. CS类型:有的程序需要统一管理软件中使用的数据, 所以就将保存数据的数据库统一存放在一台主机中, 所有的用户在需要数据时都要从主机获取, 这时就分 ...

  3. 【NOIP2016提高A组模拟8.15】Garden

    题目 分析 其实原题就是[cqoi2012][bzoj2669]局部极小值. 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点) ...

  4. mysql——非主键自增

    今天遇到一个问题: 要创建一张表,其中我想将ip和date这两列作为一个复合主键,可以通过如下语句修改表结构: alter table tb_name add primary key (字段1,字段2 ...

  5. shiro框架学习-7- Shiro权限控制注解和编程方式

    讲解权限角色控制 @RequiresRoles, @RequiresPermissions等注解的使用和编程式控制 配置文件的方式 使用ShiroConfig 注解方式 @RequiresRoles( ...

  6. python中的时间模块

    废话不多说,看代码 import datetime,time import calendar #时间戳 t1 = time.time() print('当前时间戳是{}'.format(t1)) #格 ...

  7. N皇后问题 --使用位运算解决

    关键位运算 x & (-x) 取得最低位1 x & (x-1) 去掉最低位1 class Solution(object): def totalNQueens(self, n): &q ...

  8. BZOJ 4488: [Jsoi2015]最大公约数 暴力 + gcd

    Description 给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列 {Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L, ...

  9. 拨号操作——android.intent.action.CALL

    button_14.setOnClickListener(new View.OnClickListener() {          @Override     public void onClick ...

  10. sklearn—LinearRegression,Ridge,RidgeCV,Lasso线性回归模型简单使用

    线性回归 import sklearnfrom sklearn.linear_model import LinearRegression X= [[0, 0], [1, 2], [2, 4]] y = ...