这三种排序算法的性能比较如下:

排序名称 时间复杂度(平均) 时间复杂度(最坏) 辅助空间 稳定性
快速排序 O(nlogn) O(n*n) O(nlogn) 不稳定
堆排序 O(nlogn) O(nlogn) O(1) 不稳定
归并排序 O(nlogn) O(nlogn) O(n) 稳定

以下除特殊说明外均针对元素数为n的一个序列。

1.归并排序

  归并排序的基本思想是递归地将两个或多个有序子序列合并成一个新的有序子序列,最终得到一个长度为n的有序序列。

  看这里,我们先将序列看成n个有序的子序列,每个序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列,然后两两归并,........,如此重复,直到得到长度为n的一个有序子序列,这种方法称为2路归并排序,如果每次操作将3个有序子序列归并,则称为3路归并排序。

  以下以2路归并排序为例进行说明:

  

  python实现2路归并排序————

def merge_sort(list):
if len(list)<2:
return list
left=merge_sort(list[0:int(len(list)/2)])
right=merge_sort(list[int(len(list)/2):])
return merg(left,right) def merg(l1,l2):
i=0
j=0
list=[]
while i<len(l1) and j<len(l2):
if l1[i]<l2[j]:
list.append(l1[i])
i=i+1
else:
list.append(l2[j])
j=j+1
list.extend(l2[j:])
list.extend(l1[i:])
return np.array(list)

2.快速排序

  快速排序的基本思想是任选序列中的一个数据元素(默认选择第一个数据元素)作为pivot,以其为基准,对剩下的元素作以下处理——比pivot大的排在pivot后面,比pivot小的排在pivot前面。然后以pivot为界把序列划分为两个部分,再对这两个部分递归上述过程直到每一部分中只剩下一个数据元素为止。

  一种操作方法是,对每个递归步——设pivot为arr[low],首先从arr[high]所指的位置开始向左搜索到第一个小于的数据元素(此数据元素仍假记为)为止,然后交换arr[low]和arr[high],这时pivot为high,再从low所指位置开始向右搜索到第一个大于high的数据元素(此数据仍假记为low)为止,然后交换low和high,此时pivot为low,重复这两步直到low=high时为止,这时pivot的位置为arr[low]。

  

  python实现快速排序——

#本处函数输入和输出均为list列表类型
def quick_sort(list):
if len(list) >= 2: # 递归入口及出口
mid = list[len(list)//2] # 选取基准值,也可以选取第一个或最后一个元素
left, right = [], [] # 定义基准值左右两侧的列表
list.remove(mid) # 从原始数组中移除基准值
for num in list:
if num >= mid:
right.append(num)
else:
left.append(num)
return quick_sort(left) + [mid] + quick_sort(right)
else:
return list

  

3.堆排序

  堆排序基于堆heap的数据结构进行排序,只需要一个元素的辅助存储空间。以下只针对大顶堆,大顶堆的堆顶元素为最大。

  排序过程是这样的——首先将原始序列构建为一个大顶堆。弹出堆顶元素,对剩下的堆进行维护操作,此时堆顶为堆中这几个元素中的最大,如此重复,最后堆所输出的元素组成了有序序列,即为我们要的排序好的序列。

  

#这里用的是最小堆
def heap_sort(list):
result=[]
list.insert(0,None)
k=len(list)
while k>1:
k-=1
i=0
while 2**(i+1)<len(list):
i+=1
while i>0:
for p in range(2**i-1,2**(i-1)-1,-1):
if 2*p<len(list) :
if list[p]>list[2*p]:
list[p],list[2*p]=list[2*p],list[p]
if 2*p+1<len(list) :
if list[p]>list[2*p+1]:
list[p],list[2*p+1]=list[2*p+1],list[p]
i-=1 result.append(list[1])
list[1]=list[-1]
list.pop() return result

Reference:
  1.  《Data Structures and Algorithm Analysis》,Shaffer

  2.https://www.cnblogs.com/dynmi/p/10967090.html

<算法基础><排序>三种高级排序——快速排序,堆排序,归并排序的更多相关文章

  1. Redis五种基础与三种高级数据结构解析

    记得点赞+关注呦. 前言 在 Redis 最重要最基础就属 它丰富的数据结构了,Redis 之所以能脱颖而出很大原因是他数据结构丰富,可以支持多种场景.并且 Redis 的数据结构实现以及应用场景在面 ...

  2. c语言实现基本的数据结构(二) 链表(包括链表的三种简单排序算法)

    #include "stdafx.h" #include <stdlib.h> //创建一个节点,data为value,指向NULL Node* Create(int ...

  3. java基础-jdbc——三种方式加载驱动建立连接

    String url = "jdbc:mysql://localhost:3306/student?Unicode=true&characterEncoding=utf-8" ...

  4. Tomcat 的三种高级运行模式

    Tomcat 的连接器有两种:HTTP和AJP AJP(Apache JServ Protocol):AJP是面向数据包的基于TCP/IP的协议,它在Apache和Tomcat的实例之间提供了一个专用 ...

  5. 【重学Java】多线程基础(三种创建方式,线程安全,生产者消费者)

    实现多线程 简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 并发和并行[理解] 并行:在同一时刻, ...

  6. 三种简单排序算法(java实现)

    一.冒泡排序 算法思想:遍历待排序的数组,每次遍历比较相邻的两个元素,如果他们的排列顺序错误就交换他们的位置,经过一趟排序后,最大的元素会浮置数组的末端.重复操                   作 ...

  7. JS三种简单排序算法

    冒泡排序:最简单.最慢.长度小于7的时候最优 插入排序:比冒泡要快比快速排序和希尔排序慢,数据量小的时候优势大 快速排序:速度很快  //js利用systemSort进行排序 systemSort: ...

  8. Java 最基础的三种排序排序

    主要讲五个排序,冒泡排序.选择排序.插入排序 1)冒泡排序 /** * 冒泡排序 (默认升序排) * 相邻两个相比较,较大的向后放,从数组或者集合中的第一个与第二个比较到倒数第二个与最后一个比较为一轮 ...

  9. js三种经典排序:冒泡排序、插入排序、快速排序

    冒泡排序: function bubbleSort(arr){ for(var r=1;r<arr.length-1;r++){ for(var i=0;i<arr.length-r;i+ ...

随机推荐

  1. Java实现多态的机制是什么?

    靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型 ...

  2. [考试反思]0917csp-s模拟测试45:天命

    又倒一了. 关于心态,有不少想说的. 首先旁边坐了一个kx.他上来入手T1没多久就切了然后开始对拍拍了几十万组AC. 然而我觉得T1是神仙题.先进T2. 挺简单的,5分钟出正解,然后在打出来的时候突然 ...

  3. [考试反思]0815NOIP模拟测试22

    40分,15名. 1-4:120 75 70 70 35分20名...总之差距极小不想说了 昨天教练说:以后的考试还是联赛知识点,但是难度比联赛高. 没听进去,以为是对于所有人而言的,也就是T1难度变 ...

  4. CSPS模拟 47

    考试时T1没玩明白,用一个WA90把100盖住了? T1 Emotional Flutter 题目非常蠢萌,只是注意当你把黑块前伸s距离后,应把脚的长度视为0,而不应为1. T2 Endless Fa ...

  5. apache+php+mysql搭建php环境

    1.首先准备解压包:zend-loader-php5.6-windows-x86_update1(nts版).php-5.6.37-nts-Win32-VC11-x86.mysql-5.5.19-wi ...

  6. unittest加载测试用例名称必须以test开头,是否可以定制化

    ​ 前几天,在一个群里,一个人问了,这样一个问题.说他面试遇到一个面试官,问他,为啥unittest的测试用例要用test 开头,能不能定制化.他不知道为啥. 看到这个题目,我回答当然可以了,可以用l ...

  7. php查询字符串的函数

    /* 查找一个字符串在另一个字符串的第一次出现,并返回其余部分(strstr别名) */ var_dump(strchr("hello world hello", "wo ...

  8. windows 2008 服务器优化:停powershell,卸载不相干软件,开启防火墙

    windows 2008 作为 全录 的服务器,经常cpu达到100%,查看是powershell.exe占cpu有98%.影响 全录 软件进行电话录音.所以想禁止powershell.exe程序启动 ...

  9. PHP 格式化公钥私钥(pem文件)

    <?php header("Content-Type: text/html; charset=utf-8"); $filename = dirname(__FILE__).& ...

  10. 一分钟带你了解下Spring Security!

    一.什么是Spring Security? Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,它是用于保护基于Spring的应用程序的实际标准. Spring Secu ...