python实现排序
文章目录
- 排序
- 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实现排序相关推荐
- python set 排序_python set 排序_如何在Python中使用sorted()和sort()
点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基 著 18财税3班 李潇潇 译 日期:2019年5月6日 一. 使用sorted() ...
- python列表按照指定顺序排序-Python常见排序操作示例【字典、列表、指定元素等】...
本文实例讲述了Python常见排序操作.分享给大家供大家参考,具体如下: 字典排序 按value排序 d1 = {"name":"python","b ...
- Python列表排序 reverse、sort、sorted 操作方法详解
python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级python list排序中,后两中方法还可以加入条件参数进行排序. ...
- python的for语句写新的字符串_python写for循环python字符串排序方法
一般情况下,python中对一个字符串排序相当麻烦: 一.python中的字符串类型是不允许直接改变元素的.必须先把要排序的字符串放在容器里,如list. 二.python中的list容器的sort( ...
- python 经典排序算法
python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...
- [转载] Python列表排序 list.sort方法和内置函数sorted
参考链接: Python中的函数 Python列表排序 list.sort方法和内置函数sorted 很多时候我们获取到一个列表后,这个列表并不满足我们的需求,我们需要的是一个有特殊顺序的列表. 这时 ...
- Python列表排序 list.sort方法和内置函数sorted
Python列表排序 list.sort方法和内置函数sorted 很多时候我们获取到一个列表后,这个列表并不满足我们的需求,我们需要的是一个有特殊顺序的列表. 这时候就可以使用list.sort方法 ...
- python常见排序算法解析
python--常见排序算法解析 算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法,分 ...
- 送你一个Python 数据排序的好方法
摘要:学习 Pandas排序方法是开始或练习使用 Python进行基本数据分析的好方法.最常见的数据分析是使用电子表格.SQL或pandas 完成的.使用 Pandas 的一大优点是它可以处理大量数据 ...
- python汉字排序_【IT专家】Python中文排序(转载)
本文由我司收集整编,推荐下载,如有疑问,请与我司联系 Python 中文排序(转载) 2012/02/02 3793 Python 比较字符串大小时,根据的是 ord 函数得到的编码 值.基于它的排序 ...
最新文章
- 分布式架构下,Session 共享有什么方案?
- 请别埋没了URL Routing
- c语言程序设计棋盘不对齐,经典c语言程序设计例(55页)-原创力文档
- linux cp指令报错:cp: omitting directory ‘xxx‘(需要加-r递归拷贝)
- 饱和气压与温度的关系_不同温度下空气中饱和水分含量及饱和蒸汽压
- SAP Spartacus page slot里的Component,对应的DOM节点是如何插入到DOM tree里的
- python中的键不允许重复_为什么python允许您使用重复键创建字典
- MYSQL——《数据库》实验壹——熟悉数据库管理工具、数据库和表的基本操作
- 关于如何控制一个页面的Ajax读数据只读一次的简单解决办法!
- 主播冲刺GMV,全靠iPhone和茅台?
- vps没有mysql怎么用商店_如何在本地搞一个小程序的服务器之我没有vps我也很绝望呀...
- 『力荐汇总』这些 VS Code 快捷键太好用,忍不住录了这34张gif动图
- 不要让SOA控制我们的思想
- linq拼接where语句_C# 10. LINQ 的三种查询语句写法
- JSP(一):JSP概要
- 【Python】SyntaxError: Non-ASCII character '\xe8' in file
- [2018.03.13 T1] 比赛(contest)
- android stagefright
- 你是否想拥有一款自己的直播软件?
- android 卡片行星,卡片详情