快速排序和堆排序算法的比较与详解
快速排序:
原理:
1、通过partion函数将列表最左边的数归位(归位的这个数左边的数都是比他小的,右边都是比他大的数)
2、通过partion函数递归,将每一个数归位
partion函数解读:
关键问题:
left<right:保证了至少有两个数,当left和right相等时就把保存的那个数写入(归位);
循环里面为什么要写left<right判断?
首先、假设tmp右边的所有数都比他大 ,这时就会让left指针和right指针指到一起,这里不写条件right指针就会越界(找不到值了!),所以这里要加上;其次、当右边找到了比tmp小的数,就会将这个数写到左边的left指针指向的位置上,然后循环调整;最后、这个条件不成立的时候恰好就是left和right指针指向同一个位置的时候,这个位置就是我们要放之前存tmp的位置。
递归:
不断分为两部分,让每个数都归位。
时间复杂度:
O(nlogn) 快速排序默认是最快的排序
快速排序优化:
假如:遇到最坏的情况(9,8,7....)
这时就要考虑修改递归的最大深度了;
解决方法<生成一个随机数将他对应的值与tmp交换/降低了上面这种随机事件发生的概率>
堆排序:主要就是三步(向下调整、建立堆、挨个出数)
先来了解一些树(一种数据结构)的知识:
根节点:A;
叶子的节点:位于最外层的位置 BCHIPQKLMN;
树的深度(层数);
树的度(往下的最多的叉数) 例如这里:上面的数的度就是6;
孩子节点在父节点下面,父亲节点在孩子节点上面;
子树:类似于包含在树树里的小枝丫。
通俗来说:完全二叉树就是最后一层可以的左边部分按顺序不能缺失,右边的部分按顺序可以缺失,除了最后一层其他节点下面都有两个叉;而满二叉树就是对应的每一个节点下面都有两个叉,最后一层是满的。
堆排序主要采用顺序存储方式。
父亲:i
左孩子:2*i+1
右孩子:2*i+2
孩子:n(不管左孩子还是右孩子)
父亲:(n-1)//2
本文主要是用大根堆(父亲比孩子大)
向下调整的函数优化:
堆排序的本质:调整 构建堆 挨个出数
Python第三方库heapq:
最后测试一下快排和堆排谁更快:
通过在函数上面安装装饰器检测两种排序算法的效率
装饰器安装代码:
很显然是快速排序快!!!
不相信的小伙伴可以在自己电脑上试试看,分别调用执行快排和堆排函数注意要修改递归的最大深度!!!
快速排序和堆排序算法的比较与详解相关推荐
- 算法经典“钓鱼”问题详解 基于贪心算法 C语言描述
算法经典"钓鱼"问题详解 基于贪心算法 初始条件 在一条水平路边,有 n 2 ≤ n ≤ 25个钓鱼池,从左到右编号为1.2.3.--.n.小明有H1 ≤ H ≤ 16个小时的空余 ...
- 操作系统:基于页面置换算法的缓存原理详解(下)
概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...
- 希尔排序基础java代码_java 算法之希尔排序详解及实现代码
摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...
- kmeans python interation flag_机器学习经典算法-logistic回归代码详解
一.算法简要 我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类.这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下: 可以较为清楚的看到,当输入的x小于0 ...
- python实验原理_Python实现蒙特卡洛算法小实验过程详解
蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城-摩纳哥的蒙特卡洛来命名这种方法. 通俗的解释一 ...
- Matlab中的FCM算法代码及中文详解
Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...
- 图解机器学习算法(6) | 决策树模型详解(机器学习通关指南·完结)
作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...
- KMP算法之next数组详解
KMP算法之next数组详解 KMP算法实现原理 KMP算法是一种非常高效的字符串匹配算法,下面我们来讲解一下KMP算如何高效的实现字符串匹配.我们假设如下主串和模式串: int i;//i表示主串的 ...
- 天津理工大学《操作系统》实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解
天津理工大学<操作系统>实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解 实验内容 1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不 ...
最新文章
- docker 上传到自己的容器
- linux怎么给所有用户安装软件,Linux安装软件的几种方法
- (42) Aeroo 模板实战
- 网页客户端调用gSoap发布服务,以及中文乱码问题
- 耗时两个礼拜,8000字安卓面试长文,建议收藏
- 信息学奥赛一本通(2023:【例4.8】数据统计)
- 微信小程序 navigator 用来实现页面跳转功能
- 嘉年华专访 | 我有故事,你有酒吗?
- 如何配置openjdk的 java home
- 计算机基础知识运算符,计算机基础运算符
- Mac下虚拟机使用那些事儿
- 如何access表中加一行_access数据库增加一行
- vue 使用 vue-awesome-swiper(swiper)解决方法
- 日照-公积金贷款逾期预测-比赛总结
- 爬虫系列 | 4、详解Requests的用法
- Turtlebot3入门教程(Burger)
- GRAF: Generative Radiance Fields for 3D-Aware Image Synthesis
- vue:hadoop@1.0.0 dev: `webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
- 零基础如何学习Web安全渗透测试?推荐这份史上最详细的自学路线图!
- 减肥服务APP开发详细内容