文章目录

  • 排序
    • 1)定义
    • 2)算法好坏衡量指标
    • 1、冒泡排序
      • 1)思路分析
      • 2)代码实现
      • 3)算法分析
    • 2、选择排序
      • 1)思路分析
      • 2)代码实现
      • 3)算法分析
    • 3、插入排序
      • 1)思路分析
      • 2)代码实现
      • 3)算法分析
    • 4、希尔排序
      • 1)思路分析
      • 2)代码实现
      • 3)希尔排序特点
      • 4)算法分析
    • 5、快速排序
      • 1)思路分析
      • 2)代码实现
      • 3)算法分析
    • 6、归并排序
      • 1)思路分析
      • 2)代码实现
      • 3)算法分析
    • 排序算法对比

排序

1)定义

将元素按照某种顺序排列的过程

2)算法好坏衡量指标

1)时间复杂度
将每一步操作看成基本计算单位,解决问题所需的步骤数.
“计算工作量”、“进本运算次数”

2)空间复杂度
执行算法所需要的存储空间,包括:输入数据所占空间、程序本身所占空间、算法执行过程需要的额外空间
这里,我们只考虑完成排序所需要的额外辅助空间

3)稳定性
对序列中两个相同的关键字:
若在初始序列和最终序列中的相对位置不发生变化,则称该排序是稳定的。
若在初始序列和最终序列中的相对位置发生改变,则称该排序时不稳定的。

4)总的比较次数 + 总的交换次数

1、冒泡排序

1)思路分析

多次遍历列表。比较相邻的两个元素,将不符合顺序的进行交换。每一轮便利都将下一个最大值放到正确的位置。

本质:不断消除列表的逆序

2)代码实现

def bubbleSort(alist):for i in range(len(alist) - 1):   # 外层循环表遍历了多少轮for j in range(1, len(alist) - i):   # 前面的元素两两比较交换if alist[j-1] > alist[j]:alist[j-1], alist[j] = alist[j-1], alist[j]return alist

3)算法分析

1)是稳定排序
2)时间复杂度:O(n²)
3)空间复杂度:O(1)

2、选择排序

1)思路分析

依次找到当前列表中的最小(最大)元素,并将其添加到列表前面(后面)

2)代码实现

def selectSort(alist):for i in range(len(alist) - 1):   # 外层循环表示需要找最小元素需要多少轮temp = i # temp记录当前数组最小值,初始化为当前列表第一个值for j in range(i+1, len(alist)):  # 找到当前这轮的最小元素if alist[j] < alist[i]:temp = jalist[i], alist[temp] = alist[temp], alist[i]return alist

3)算法分析

1)是不稳定排序
2)两层循环,时间复杂度O(n²)
3)只引用了temp,空间复杂度O(1)

3、插入排序

1)思路分析

依次将每个待排序的记录插入到一个有序序列的适当位置
类似生活中扑克牌排序

2)代码实现

def insertSort(alist):n = len(alist)for i in range(1,n):temp = alist[i]j = i - 1while j >= 0 and alist[j] > alist[j+1]:alist[j+1] = alist[j]alist[j] = tempj -= 1return alist

更加符合该排序定义的是

def insertSort(alist):n = len(alist)for i in range(1,n):temp = alist[i]   # temp是我们现在待排序的元素j = i - 1while j >= 0 and alist[j] > alist[j+1]:alist[j+1] = alist[j]j -= 1alist[j] = temp  return alist

即我们将alist[j] = temp移动到在while循环中
如果在循环内部,那我们是将待排序元素与前一个元素不断交换
而不是直接**“插入**”在合适位置。
放在循环外部后,我们是先通过while循环找到应该插入的位置,然后再将该元素插入(想象扑克牌排序的),符合定义

3)算法分析

1)是稳定排序
2)比较次数:
最好情况=n-1 = O(n²) ;
最坏情况n-1 + n-2 + n-3 + …+ 3+2+1 = O(n²)
移动次数:
最好情况:(有序)=0
最坏情况1+2+3+…+n-2 + n-1 = O(n²)
3)时间复杂度O(n2);空间复杂度O(1)**

4、希尔排序

1)思路分析

对直接插入排序进行改进,将列表分成数个子列表,分别对每一个子列表进行插入排序
1)定义增量递增序列(eg:gap1 = 5,gap2 = 3,gap3 = 1)
2)对于每个gap艰巨的数据作为一组,进行直接插入排序

2)代码实现

def shellSort(alist):n = len(alist)gap = n // 2  # 初始化gapwhile gap >= 1:for i in range(gap,n):temp = alist[i]       # temp为当前待排序的数据(扑克牌中待插入的牌)j = i - gap         # j为子数列中前面有序部分while j >= 0 and alist[j] > temp:alist[j+gap] = alist[j]alist[j] = tempj -= gap # 上述完成了间距gap时左右子数列的插入排序,接下来更新gapgap //= 2return alist

1、for i in range(gap, n)
索引[0–gap-1]的为包含各子数列的第一个元素,对应插入排序中的第0个,这部分默认一开始就有序的。因此插入排序从gap—>n

3)希尔排序特点

1)一次移动较大位置,跳跃式的接近排序后的最终结果
2)最后一次只需移动较少元素
3)增量序列必须递减,且最后一个必须为1

4)算法分析

1)不稳定排序
2)空间复杂度:O(1)
3)时间复杂度:最好情况O(n);最坏情况O(n²)

5、快速排序

1)思路分析

1)每一趟子表的形成时采用两头向中间交替式逼近法,直至low与high重合
2)由于每趟子表的操作相同,因此用递归算法

2)代码实现

def getIndex(ls, low, high):temp = ls[low]   # 选定基准值while low < high:   while high > low and ls[high] >= temp:high -= 1ls[low] = ls[high]   # 上面循环条件不满足时while low < high and ls[low] <= temp:low += 1ls[high] = ls[low]# 下列为循环条件low<high不满足时,此时low = highls[low] = temp    # 将基准值插入到现在空余的位置return lowdef quickSort(alist, low, high):if low < high:  index = getIndex(alist, low, high)quickSort(alist, 0, index - 1)  # 递归quickSort(alist, index + 1, high)return alist

3)算法分析

1)是不稳定排序
2)时间复杂度O(n²)
就平均计算时间而言,快速排序是内部排序中最好的
3)空间复杂度
程序使用了递归,需要调用栈来支持。栈的长度取决于递归的深度。也可以用户自己设计用户栈。
平均情况:栈空间O(log n)   最坏情况:O(n)

6、归并排序

1)思路分析

将若干个已排序好的有序表合并成一个新的有序表
归并排序分为两个过程:
1)拆分阶段:将原序列逐步拆分成都越来越小的子序列
2)归并阶段:将排好序的子序列逐步合成最终结果

2)代码实现

def merge(ls1,ls2):t1,t2 = 0, 0ls3 = []while t1 < len(ls1) and t2 < len(ls2):if ls1[t1] < ls2[t2]:ls3.append(ls1[t1])t1 += 1else:ls3.append(ls2[t2])t2 += 1# 循环终止条件判断if t1 == len(ls1):ls3 += ls2[t2:]   # 这里只能用列表的拼接,用append是在列表中添加列表else:ls3 += ls1[t1:]return ls3def mergeSort(alist):n = len(alist)if n <= 1:return alistmid = n//2left = mergeSort(alist[:mid])right = mergeSort(alist[mid:])# 以上是拆分阶段,下面调用merge()函数是归并阶段return merge(left,right)

3)算法分析

1)每趟归并merge()时间复杂度O(n),整个递归算法需要logn(以2为底数,n为真数)。递归排序的时间复杂度为O(n*logn)
2)归并排序算法简单,但是需要用到递归操作,递归操作需用栈。辅助空间大
3)是稳定排序

以下补充说明为什么递归算法需要logn次合并

1)合并的次数 = 拆分的次数,拆分过程是一分为二。
1-->2-->4-->8-->...
是以1为首项,2为公比的等差数列。也是完全二叉树的结构。
2)待排序元素个数n=完全二叉树叶子结点的个数n= 2**(k-1)
3)归并次数x=二叉树的层数k-1= k-1
所以归并次数x=logn

排序算法对比

python实现排序相关推荐

  1. python set 排序_python set 排序_如何在Python中使用sorted()和sort()

    点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基  著 18财税3班 李潇潇    译 日期:2019年5月6日 一. 使用sorted() ...

  2. python列表按照指定顺序排序-Python常见排序操作示例【字典、列表、指定元素等】...

    本文实例讲述了Python常见排序操作.分享给大家供大家参考,具体如下: 字典排序 按value排序 d1 = {"name":"python","b ...

  3. Python列表排序 reverse、sort、sorted 操作方法详解

    python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级python list排序中,后两中方法还可以加入条件参数进行排序. ...

  4. python的for语句写新的字符串_python写for循环python字符串排序方法

    一般情况下,python中对一个字符串排序相当麻烦: 一.python中的字符串类型是不允许直接改变元素的.必须先把要排序的字符串放在容器里,如list. 二.python中的list容器的sort( ...

  5. python 经典排序算法

    python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...

  6. [转载] Python列表排序 list.sort方法和内置函数sorted

    参考链接: Python中的函数 Python列表排序 list.sort方法和内置函数sorted 很多时候我们获取到一个列表后,这个列表并不满足我们的需求,我们需要的是一个有特殊顺序的列表. 这时 ...

  7. Python列表排序 list.sort方法和内置函数sorted

    Python列表排序 list.sort方法和内置函数sorted 很多时候我们获取到一个列表后,这个列表并不满足我们的需求,我们需要的是一个有特殊顺序的列表. 这时候就可以使用list.sort方法 ...

  8. python常见排序算法解析

    python--常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分 ...

  9. 送你一个Python 数据排序的好方法

    摘要:学习 Pandas排序方法是开始或练习使用 Python进行基本数据分析的好方法.最常见的数据分析是使用电子表格.SQL或pandas 完成的.使用 Pandas 的一大优点是它可以处理大量数据 ...

  10. python汉字排序_【IT专家】Python中文排序(转载)

    本文由我司收集整编,推荐下载,如有疑问,请与我司联系 Python 中文排序(转载) 2012/02/02 3793 Python 比较字符串大小时,根据的是 ord 函数得到的编码 值.基于它的排序 ...

最新文章

  1. 分布式架构下,Session 共享有什么方案?
  2. 请别埋没了URL Routing
  3. c语言程序设计棋盘不对齐,经典c语言程序设计例(55页)-原创力文档
  4. linux cp指令报错:cp: omitting directory ‘xxx‘(需要加-r递归拷贝)
  5. 饱和气压与温度的关系_不同温度下空气中饱和水分含量及饱和蒸汽压
  6. SAP Spartacus page slot里的Component,对应的DOM节点是如何插入到DOM tree里的
  7. python中的键不允许重复_为什么python允许您使用重复键创建字典
  8. MYSQL——《数据库》实验壹——熟悉数据库管理工具、数据库和表的基本操作
  9. 关于如何控制一个页面的Ajax读数据只读一次的简单解决办法!
  10. 主播冲刺GMV,全靠iPhone和茅台?
  11. vps没有mysql怎么用商店_如何在本地搞一个小程序的服务器之我没有vps我也很绝望呀...
  12. 『力荐汇总』这些 VS Code 快捷键太好用,忍不住录了这34张gif动图
  13. 不要让SOA控制我们的思想
  14. linq拼接where语句_C# 10. LINQ 的三种查询语句写法
  15. JSP(一):JSP概要
  16. 【Python】SyntaxError: Non-ASCII character '\xe8' in file
  17. [2018.03.13 T1] 比赛(contest)
  18. android stagefright
  19. 你是否想拥有一款自己的直播软件?
  20. android 卡片行星,卡片详情

热门文章

  1. Lind.DDD.LindMQ~关于持久化到Redis的消息格式
  2. Antlr v4入门教程和实践
  3. 元宇宙虚拟人物制作工具:小K动捕
  4. 软高工:为什么我会在工作五年后选择去读研
  5. 我的互联网价值观、方法论和个人实践(2)-个人征信
  6. 心理学在生活中的表现和应用_心理学在日常生活中的应用
  7. ios弧形进度条_【iOS实现一个颜色渐变的弧形进度条】
  8. Microphone回音问题分析
  9. Kotlin如何运用SPI机制加载运行kts脚本
  10. 金融数字化转型难题如何破?华为五大场景化方案带来新答案