<算法基础><排序>三种高级排序——快速排序,堆排序,归并排序

这三种排序算法的性能比较如下:
| 排序名称 | 时间复杂度(平均) | 时间复杂度(最坏) | 辅助空间 | 稳定性 |
| 快速排序 | 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
<算法基础><排序>三种高级排序——快速排序,堆排序,归并排序的更多相关文章
- Redis五种基础与三种高级数据结构解析
记得点赞+关注呦. 前言 在 Redis 最重要最基础就属 它丰富的数据结构了,Redis 之所以能脱颖而出很大原因是他数据结构丰富,可以支持多种场景.并且 Redis 的数据结构实现以及应用场景在面 ...
- c语言实现基本的数据结构(二) 链表(包括链表的三种简单排序算法)
#include "stdafx.h" #include <stdlib.h> //创建一个节点,data为value,指向NULL Node* Create(int ...
- java基础-jdbc——三种方式加载驱动建立连接
String url = "jdbc:mysql://localhost:3306/student?Unicode=true&characterEncoding=utf-8" ...
- Tomcat 的三种高级运行模式
Tomcat 的连接器有两种:HTTP和AJP AJP(Apache JServ Protocol):AJP是面向数据包的基于TCP/IP的协议,它在Apache和Tomcat的实例之间提供了一个专用 ...
- 【重学Java】多线程基础(三种创建方式,线程安全,生产者消费者)
实现多线程 简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 并发和并行[理解] 并行:在同一时刻, ...
- 三种简单排序算法(java实现)
一.冒泡排序 算法思想:遍历待排序的数组,每次遍历比较相邻的两个元素,如果他们的排列顺序错误就交换他们的位置,经过一趟排序后,最大的元素会浮置数组的末端.重复操 作 ...
- JS三种简单排序算法
冒泡排序:最简单.最慢.长度小于7的时候最优 插入排序:比冒泡要快比快速排序和希尔排序慢,数据量小的时候优势大 快速排序:速度很快 //js利用systemSort进行排序 systemSort: ...
- Java 最基础的三种排序排序
主要讲五个排序,冒泡排序.选择排序.插入排序 1)冒泡排序 /** * 冒泡排序 (默认升序排) * 相邻两个相比较,较大的向后放,从数组或者集合中的第一个与第二个比较到倒数第二个与最后一个比较为一轮 ...
- js三种经典排序:冒泡排序、插入排序、快速排序
冒泡排序: function bubbleSort(arr){ for(var r=1;r<arr.length-1;r++){ for(var i=0;i<arr.length-r;i+ ...
随机推荐
- 感谢ZhangYu dalao回关
- 使用Typescript重构axios(十一)——接口扩展
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 伪紫题p5194 天平(dfs剪枝)
这题作为一个紫题实在是过分了吧...绿的了不起了.—————————————————————————— 看题第一眼,01背包无误.2min打好一交全屏紫色(所以这就是这题是紫色的原因233?) re原 ...
- 由浅入深——从ArrayList浅谈并发容器
原创作品转载请附:https://www.cnblogs.com/superlsj/p/11655523.html 一.一个案例引发的思考 public class ArrayListTest { p ...
- 必知必会的JavaJDK工具
JDK中有很多用于监控诊断的系统工具,对于Java程序员来说,无疑是用来了解自己程序运行时性能好坏的强大工具. 在JDK的bin目录下就可以找到这些工具. JPS 在Linux有一个命令叫做ps,可以 ...
- js在字符串中加入一段字符串
在这个功能的实现主要是slice()方法的掌握 arrayObject.slice(start,end) start 必需.规定从何处开始选取.如果是负数,那么它规定从数组尾部开始算起的位置.也就是说 ...
- Java基础:数值类型转换、强制类型转换
数值类型之间的转换 数值类型之间的转换,在小数值往大数值转换时,不会发生精度的损失.在小数值往大数值转换时有可能发生精度的损失. 比如byte最大值也只有127,如果一个大于127的int类型数据往b ...
- hdu 5495 LCS (置换群)
Sample Input231 2 33 2 161 5 3 2 6 43 6 2 4 5 1 Sample Output24 C/C++: #include <map> #includ ...
- hdu 1533 Going Home (KM)
Going HomeTime Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- DAL
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Data;u ...