排序是算法学习中最基本的问题。

1.平均时间复杂度均为O(N2)的排序

1.1 插入排序

插入排序对少量元素的排序非常有效。工作机制就像打牌一样,为了将牌插入到已排好序的牌中,需要将牌与手中的牌从右向左进行比较。

def insertionSort(alist):
n=len(alist)
for i in xrange(1,n):
key=alist[i]
j=i-1
while j>=0 and alist[j]>=key:
alist[j+1]=alist[j]
j-=1
alist[j+1]=key
return alist

1.2 冒泡排序

冒泡排序通过重复的交换相邻的两个反序元素来将最大元素置于数组末尾。

def bubbleSort(alist):
n=len(alist)
for i in xrange(n-2,0,-1):
for j in xrange(i+1):
if alist[j]>alist[j+1]:
alist[j],alist[j+1]=alist[j+1],alist[j]
return alist

1.3 选择排序

首先找出序列中的最大元素,与最后一个元素交换位置,然后找出次大元素,与倒数第二个元素交换位置,以此类推。

def selectionSort(alist):
n=len(alist)
for i in xrange(n-1,0,-1):
posofMax=0
for j in xrange(1,i+1):
if alist[j]>=alist[posofMax]:
posofMax=j
a[posofMax],a[i]=a[i],a[posofMax]
return alist

1.4 希尔排序

SHELL排序通过比较相距一定间隔的元素来工作。各趟排序随着算法的进行而减小,直到只比较相邻元素的最后一趟为止。

使用希尔增量(ht=N/2,hk=hk+1/2)时希尔排序的最坏运行时间为Θ(N2),使用Hibbard增量(1,3,7,...,2k-1)的希尔排序的最坏运行时间为Θ(N3/2)。

def shellSort(alist):
n=len(alist)/2
while n>0:
gapinsertionSort(alist,n)
n=n/2
return alist
def gapinsertionSort(alist,gap):
n=len(alist)
for i in xrange(gap):
for j in xrange(i+gap,n,gap):
key=alist[j]
x=j-gap
while x>=0 and a[x]>=key:
a[x+gap]=a[x]
x-=gap
a[x+gap]=key

2.平均时间复杂度均为O(NlogN)的排序

2.1 合并排序

合并排序基本的操作是合并两个已排序的表。它是递归算法的一个很好的实例。合并排序需要花费将数据拷贝到临时数组再拷贝回来这样一些附加的工作。

def mergeSort(alist):
if len(alist)>1:
q=len(alist)/2
left=alist[:q]
right=alist[q:]
mergeSort(left)
mergeSort(right)
i=0
j=0
k=0
while i<len(left) and j<len(right):
if left[i]<right[j]:
alist[k]=left[i]
i+=1
else:
alist[k]=right[j]
j+=1
k+=1
while i<len(left):
alist[k]=left[i]
i+=1
k+=1
while j<len(right):
alist[k]=right[j]
j+=1
k+=1
return alist

  合并排序的另一种非递归实现

def mergeSort(alist):
n=len(alist)
i=1
while i<n:
start=0
t=start+i-1
end=start+2*i-1
while end<n:
merge(alist,start,t,end)
start=end+1
t=start+i-1
end=start+2*i-1
if t<n-1:
merge(alist,start,t,n-1)
i=i*2
return alist def merge(alist,start,t,end):
left=alist[start:t+1]
right=alist[t+1:end+1]
i=0
j=0
k=start
while i<len(left) and j<len(right):
if left[i]<right[j]:
alist[k]=left[i]
i+=1
else:
alist[k]=right[j]
j+=1
k+=1
while i<len(left):
alist[k]=left[i]
i+=1
k+=1
while j<len(right):
alist[k]=right[j]
j+=1
k+=1

 2.2 堆排序

建立最大堆后将最大元素与堆最后的单元互换,堆大小缩小一,然后执行根的下滤操作找出第二大的元素。

def heapSort(alist):
n=len(alist)
buildMaxHeap(alist)
for i in xrange(n-1,0,-1):
alist[i],alist[0]=alist[0],alist[i]
perDown(alist,0,i-1)
return alist
def buildMaxHeap(alist):
n=len(alist)
for i in xrange(n/2-1,-1,-1):
perDown(alist,i,n-1)
def perDown(alist,start,end):
left=start*2+1
right=left+1
large=start
if left<=end and alist[left]>alist[start]:
large=left
if right<=end and alist[right]>alist[large]:
large=right
if large!=start:
alist[large],alist[start]=alist[start],alist[large]
perDown(alist,large,end)

2.3 快速排序

快速排序是在实践中最快的已知排序算法,像合并排序一样也是一种分治的递归算法。

1.如果元素个数为0或1,则返回。

2.取数组中任一元素v,称之为枢纽元。

3.将数组分为2个不相交的部分,一部分元素小于v,另一部分大于v。

4.对两部分分别递归的使用快速排序。

下图取第一个元素为枢纽元v,leftmark从第二个元素开始,rightmark从倒数第一个元素开始。

当leftmark在rightmark左边时,将leftmark右移,移过小于v的元素,将rightmark左移,移过大于v的元素,当leftmark,rightmark停止时,

将leftmark和rightmark元素互换,直到leftmark到rightmark右边为止。

def quickSort(alist):
n=len(alist)
_quickSort(alist,0,n-1)
return alist
def _quickSort(alist,s,e):
if s<e:
v=alist[s]
i=s+1
j=e
while True:
while i<=j and alist[i]<v: #如果i和j遇到等于枢纽元的关键字,都停止
i+=1
while j>=i and alist[j]>v:
j-=1
if i<j:
alist[i],alist[j]=alist[j],alist[i]
i+=1
j-=1
else:
break
alist[s],alist[j]=alist[j],alist[s]
_quickSort(alist,s,j-1)
_quickSort(alist,i,e)

另一种写法

def quickSort(alist):
n=len(alist)
_quickSort(alist,0,n-1)
return alist
def _quickSort(alist,s,e):
if s<e:
v=alist[e]
i=s #用i将数组分为两部分
for j in xrange(s,e):
if alist[j]<=v:
alist[j],alist[i]=alist[i],alist[j]
i+=1
alist[e],alist[i]=alist[i],alist[e]
_quickSort(alist,s,i-1)
_quickSort(alist,i+1,e)

  

Python基于比较的排序的更多相关文章

  1. 漫谈python中的搜索/排序

    在数据结构那一块,搜索有顺序查找/二分查找/hash查找,而排序有冒泡排序/选择排序/插入排序/归并排序/快速排序.如果遇到数据量和数组排列方式不同,基于时间复杂度的考虑,可能需要用到混合算法.如果用 ...

  2. [python学习] 语言基础—排序函数(sort()、sorted()、argsort()函数)

    python的内建排序函数有 sort.sorted两个. 1.基础的序列升序排序直接调用sorted()方法即可 ls = list([5, 2, 3, 1, 4]) new_ls = sorted ...

  3. Python list列表的排序

    当我们从数据库中获取一写数据后,一般对于列表的排序是经常会遇到的问题,今天总结一下python对于列表list排序的常用方法: 第一种:内建函数sort() 这个应该是我们使用最多的也是最简单的排序函 ...

  4. python基于LeanCloud的短信验证

    python基于LeanCloud的短信验证 1. 获取LeanCloud的Id.Key 2. 安装Flask框架和Requests库 pip install flask pip install re ...

  5. Python基于共现提取《釜山行》人物关系

    Python基于共现提取<釜山行>人物关系 一.课程介绍 1. 内容简介 <釜山行>是一部丧尸灾难片,其人物少.关系简单,非常适合我们学习文本处理.这个项目将介绍共现在关系中的 ...

  6. Python 基于Python实现的ssh兼sftp客户端(上)

    基于Python实现的ssh兼sftp客户端   by:授客 QQ:1033553122 实现功能 实现ssh客户端兼ftp客户端:实现远程连接,执行linux命令,上传下载文件 测试环境 Win7 ...

  7. 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序

    题目: 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序 public static int maxGap(int nums[]) { if ( ...

  8. Python字典按值排序的方法

    Python字典按值排序的方法: 法1: (默认升序排序,加  reverse = True 指定为降序排序) # sorted的结果是一个list dic1SortList = sorted( di ...

  9. solr特点三: 基于Solr实现排序定制化参考

    排序实现有N种形式,最低成本.最快响应时间是目标 一份索引,支持N种排序策略并且在线互不干扰是要考虑的每一种实现,处理的场景是不同的,不要千篇一律 020排序,从索引到效果,有不少坑,这篇文章没有细说 ...

随机推荐

  1. 信号之alarm和pause函数

    使用alarm函数可以设置一个计时器,在将来某个指定的时间,该计时器会超时.当计时器超时时,产生SIGALRM信号.如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程. #incl ...

  2. Dashboards (Android)

    his page provides information about the relative number of devices that share a certain characterist ...

  3. Setting up a database adapter

    Setting up a database adapter zend-db provides a general purpose database abstraction layer. At its ...

  4. Android_UI

    * fang@author * Android布局原则: * (1)尽量多使用LinearLayout和RelativeLAyout,不要使用AbsoluteLayout * (2)在布局层次一样的情 ...

  5. ORACLE 优化

    本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了 ORACLE数据库的优化调整方案. 关键词 ORACLE数据库 环境 ...

  6. Hibernate学习笔记--------1.单表操作

    一.hibernate基本开发步骤 1.引入包,官网下载的包,目录\lib\required下的jar都加进去,这里使用的是 hibernate-release-5.2.1.Final 2.编写配置文 ...

  7. mkfs.xfs命令没找到

    yum install xfsprogs xfsdump

  8. Time complexity analysis of algorithms

    时间复杂性的计算一般而言,较小的问题所需要的运行时间通常要比较大的问题所需要的时间少.设一个程序P所占用的时间为T,则 T(P)=编译时间+运行时间. 编译时间与实例特征是无关的,且可假设一个编译过的 ...

  9. jmeter接口测试之登录测试

    注册登录_登陆接口文档 1.登录 请求地址: POST   xxxxxx/Home/Login 请求参数: args={ LoginName:"mtest", // 登录名,可以为 ...

  10. php json_encode转JSON 编码显示中文

    对变量进行 JSON 编码显示中文 /**context":"/u2345/u43245/u2345 转成中文显示 * 对变量进行 JSON 编码[{"time" ...