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 ...
随机推荐
- Excel Sheet Column Title (STRING - TYPE CONVERTION)
QUESTION Given a positive integer, return its corresponding column title as appear in an Excel sheet ...
- 解决Lightmap在PC上与ios和Android上表现不同的问题
Lightmap在PC上与android和ios的区别以及解决方法 1. 问题描述 相信很多人碰到过Lightmap的一些问题: 烘培好Lightmap之后,在PC上看起来相当给力,而打包成ios或 ...
- .net VS2008 时间加减,时间段,时间格式化到秒
举个例子: DateTime time1 = DateTime.Now; DateTime time2 = time1.AddDays(1); time1是当前时间,time2比当前时间多一天.也就是 ...
- OC 线程操作 - GCD使用 -线程通讯, 延迟函数和一次性代码
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // [self downImag ...
- Redis安装异常解决办法
官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxv ...
- 201621123008 《Java程序设计》第五周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键词:接口,内部类. 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 1.3 可选:使用常 ...
- makefile all
all:udps udpc udps:udpserv.c gcc -Wall -o udps udpserv.cudpc:udpclient.c gcc -Wall -o udpc udp ...
- jQuery 操作 html5 data-* 属性
Html 部分: <a class="nav-item" href="javascript: void(0)" data-id="{{$item ...
- BeanUtils.populate的方法的作用
BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate的作用解释如下: 完整方法: BeanUtils.populate( Ob ...
- Java 继承关系中:static,构造函数,成员变量的加载顺序
首先看下面的例子: package simple.demo; /** * @author Administrator * @date 2019/01/03 */ public class ClassA ...