python——排序
从学校毕业出来后只知道冒泡排序,发现自己对排序的了解还是很浅显。
于是在网上搜索各种排序方法,以下是本人根据索搜出来的资料再结合自己理解作出的一些简单的阐述。
如果有不正确的地方欢迎大家指正。(共同学习,共同进步)
1、插入排序:最优为O(n),最坏为O(n^2),平均O(n^2)
(1)始终定义第一个元素为有序的,将剩余元素逐个插入到这个有序列中。
(2)插入过程中,将需要插入的元素与有序列中的元素逐个比较,插入到适当位置
python:
def InserSort(lists):
count = len(lists)
for i in range(1,count):
key = lists[i] #需要插入的元素
index = i #记录插入的位置
while index>0 and lists[index-1]>key:
#逐个比较,若小于前一个数则将该元素向前移动位置
lists[index] = lists[index-1]
index -= 1
#将需要插入的元素,插入指定位置
lists[index] = key
return lists
2、冒泡排序:最优为O(n),最坏为O(n^2),平均O(n^2)
(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
python:
def BubbleSort(lists):
count = len(lists)
for i in range(count):
for j in range(count-i-1):
if lists[j] > lists[j+1]:
lists[j],lists[j+1]=lists[j+1],lists[j] #前后替换
return lists
3、希尔排序:(实质上是分组插入排序)
(1)取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中
(2)各组内进行直接插入排序
(3)取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 =1,即所有记录放在同一组中进行直接插入排序为止。
def ShellSort(lists):
count = len(lists)
group = count // 2
while group>0:
for i in xrange(count):
index =i
j = i+1
while j<count:
if lists[j]<lists[index]:
index = j
j += group
if index != j:
lists[index],lists[i]=lists[i],lists[index]
group = group //2
return lists
4、快速排序:最有O(NlogN)
(1)设置两个变量i,j,排序开始的时候i=0,j=n-1。
(2)以数组第一个元素作为基数,key=A[0]。
(3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于或者等于key的值。
(4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于或者等于key的值。
(5)将第3步和第4步找到的数互换位置。
(6)重复3、4、5步骤, 直到i==j,将基数与A[i]互换。此时与A[i]为界分为两个区。
(7)将两个区重复3、4、5、6步骤
python
def quickSort(lists,left,right):
if left >= right:
return lists
#设置基数
key = lists[left]
i = left
j = right
while i < j:
#从列表右边开始找比基数小或者相等的数
while i < j and lists[j] >= key:
j = j--
#从列表左边开始找比基数大或者等于的数
while i < j and lists[i] <= key:
i = i++
if i < j:
lists[i],lists[j]=lists[j],lists[i]
#做完第一轮比较,列表分成2个去,并且i=j,将这个数设置回基数
lists[left] = lists[i]
lists[i] = key
#递归前后半区 重复上述操作
quickSort(lists,left,i-1)
quickSort(lists,j+1,right)
return lists
5、箱排序:O(m+n)
(1)设置若干个箱子,依次扫描待排序的记录R[0],R[1],…,R[n-1]
(2)把关键字等于k的记录全都装入到第k个箱子里(分配)
(3)然后按序号依次将各非空的箱子首尾连接起来(收集)。
python
def barrelSort(lists):
#选择一个最大的数
maxnum=max(lists)
#创建一个元素全是0的列表,作为箱
bucket = [0]*(maxnum+1)
#把所有元素放入箱中,对应元素个数加1
for i in lists:
bucket[i] +=1
#存储排序好的元素
sort_lists=[]
#取出箱中的元素
for j in range(len(bucket)):
if bucket[j] != 0:
for n in range(bucket[j]):
sort_lists.append(j)
return sort_lists
python——排序的更多相关文章
- python排序之二冒泡排序法
python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...
- python排序之一插入排序
python排序之一插入排序 首先什么是插入排序,个人理解就是拿队列中的一个元素与其之前的元素一一做比较交根据大小换位置的过程好了我们先来看看代码 首先就是一个无序的列表先打印它好让排序后有对比效果, ...
- 用 Python 排序数据的多种方法
用 Python 排序数据的多种方法 目录 [Python HOWTOs系列]排序 Python 列表有内置就地排序的方法 list.sort(),此外还有一个内置的 sorted() 函数将一个可迭 ...
- python排序算法实现(冒泡、选择、插入)
python排序算法实现(冒泡.选择.插入) python 从小到大排序 1.冒泡排序: O(n2) s=[3,4,2,5,1,9] #count = 0 for i in range(len(s)) ...
- Python排序算法之选择排序定义与用法示例
Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...
- 44.python排序算法(冒泡+选择)
一,冒泡排序: 是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个,如果他们的排序错误就把他们交换过来. 冒泡排序是稳定的(所谓稳定性就是两个相同的元素不会交换位置) 冒泡排序算法的运作如下 ...
- Python排序搜索基本算法之归并排序实例分析
Python排序搜索基本算法之归并排序实例分析 本文实例讲述了Python排序搜索基本算法之归并排序.分享给大家供大家参考,具体如下: 归并排序最令人兴奋的特点是:不论输入是什么样的,它对N个元素的序 ...
- python 排序算法总结及实例详解
python 排序算法总结及实例详解 这篇文章主要介绍了python排序算法总结及实例详解的相关资料,需要的朋友可以参考下 总结了一下常见集中排序的算法 排序算法总结及实例详解"> 归 ...
- Python排序函数用法
Python排序函数完美体现了Python语言的简洁性,对于List对象,我们可以直接调用sort()函数(这里称为"方法"更合适)来进行排序,而对于其他可迭代对象(如set,di ...
- 带你掌握4种Python 排序算法
摘要:在编程里,排序是一个重要算法,它可以帮助我们更快.更容易地定位数据.在这篇文章中,我们将使用排序算法分类器对我们的数组进行排序,了解它们是如何工作的. 本文分享自华为云社区<Python ...
随机推荐
- LuoguP1032 字符变换(BFS)
题目链接为:https://www.luogu.org/problemnew/show/P1032 思路:看到数据比较小,而且最多有6个规则,就可以用搜索去做了,我用的BFS,大体思路如下: 定义结构 ...
- C#操作Excel 单元格的格式处理[xyytIT]
一. C# 操作 Excel 单元格自动填充,居中对齐,字体颜色等格式设置: Excel.Range titleRange = worksheet.get_Range(worksheet.Cells[ ...
- dede5.7 GBK 在php5.4环境下 后台编辑器无法显示文章内容
问题的原因是:是htmlspecialchars,PHP 5.4后GBK编码下默认不支持中文,转换后内容为空,UTF-8编码没有任何问题. 解决方法如下: 在\include\ckeditor\c ...
- 通过命令更新git for windows
git update-git-for-windows 参考: https://github.com/PanJiaChen/vue-element-admin/issues/24 https://sta ...
- jQuery 插件使用记录
Validate 表单验证 ver 1.6 浏览更多 默认情况下,当表单 submit 时,那些验证不通过的 field 旁边会出现错误消息提示,有时很方便,但有时看起来很不美观.可以关闭此消息提示. ...
- 【JDBC】jdbc原理总结
1 什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据库 ...
- DevExpress VCL 13.1.2 发布
DevExpress VCL 的2013 第一个公开版发布, 基本上就是一些维护,没有大的变化,也没有FM 的支持. What's New in DevExpress VCL 13.1.2 Rel ...
- 2018.10.20 bzoj1079: [SCOI2008]着色方案(多维dp)
传送门 dp妙题. f[a][b][c][d][e][last]f[a][b][c][d][e][last]f[a][b][c][d][e][last]表示还剩下aaa个可以用一次的,还剩下bbb个可 ...
- C#和MatLab的混合编程(充分利用二者的优势)
C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力.在此以一个小例子的形式给大家讲述一下二者混合编程的实现. 一.软件的配置说明 C#版本:VS2010:Ma ...
- Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Unable t
spring与hibernate整合然后出现如下错误: org.springframework.beans.factory.BeanCreationException: Error creating ...