Python 实现快排、堆排
Python 实现快排、堆排
1、快排
原理:(升序)
- 选取数组的首个元素做为中间值,缓存这个中间值,该位置变为空;
- 从右到左和中间值对比,找到第一个小于中间值的元素,把该值放到左边的空位,该位置变为空;
- 从左到右和中间值对比,找到第一个大于中间值的元素,把该值放到右边的空位,该位置变为空;
- 重复步骤2和3,直到左右空位相交,然后把缓存的中间值填入该位;
- 从第4步骤的左右空位相交位为界,分左右两边重复1-4步骤,直到需要排序数组的长度≤1;
程序代码:
# 快排
def quick_sort(A, l, r):if l < r:pivot = A[l]left = lright = rwhile left < right:while A[right] > pivot and left < right:right -= 1# 左右不能相等,相等的话会进行移动,导致数组越界if left < right:A[left] = A[right]left += 1while A[left] <= pivot and left < right:left += 1if left < right:A[right] = A[left]right -= 1A[left] = pivotquick_sort(A, l, left-1)quick_sort(A, left+1, r)if __name__ == '__main__':S = [0, 2, 1, 6]quick_sort(S, 0, 3)print(S)
2、堆排
原理(用数组表示完全二叉树的层序,最小堆):
- 从最后一个叶子节点的父节点开始,比较该节点与子节点的大小;
- 如果父节点是最小值,继续比较前面的节点;如果父节点不是最小值,父节点与最小值节点交换位置,并且考虑该变换对最小值节点的子节点的影响;
- 直到比较到根节点
程序代码:
# 堆排
def heap_sort(A):for i in range((len(A) - 1) // 2, -1, -1):while i < len(A):# 子节点与父节点的位置关系left, right = i * 2 + 1, i * 2 + 2min_pos = iif (left < len(A)) and (A[left] < A[min_pos]):min_pos = leftif (right < len(A)) and (A[right] < A[min_pos]):min_pos = right# 如果最小值的位置改变了,需要考虑这个改变带来的影响if min_pos != i:A[i], A[min_pos] = A[min_pos], A[i]i = min_poselse:breakif __name__ == '__main__':S = [4, 3, 2, 1]heap_sort(S)print(S)
GOOD LUCK!
Python 实现快排、堆排相关推荐
- 快排堆排归排三种排序的比较
目录 快排 堆排序 归并排序 三种排序的比较 快排 快速排序中最简单的(递归调用) 注:倒序,和 列表中有大量重复元素时,时间复杂度很大 快排例子 注:快排代码实现(类似于二叉树 递归调用) 时间复杂 ...
- 【LeetCode笔记】215. 数组中的第K个最大元素(Java、快排、堆排、并发快排)
文章目录 题目描述 思路 & 代码 快排 基于 Fork / Join 的并发快排 针对 topK 的快排优化 堆排 基本堆排 结合题目的堆排 二刷 题目描述 大名鼎鼎的TOP K,主要考察排 ...
- python实现快排算法(quicksort)
python实现快排算法(quicksort) 快速排序是对冒泡排序的一种改进.它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后 ...
- Java面试宝典系列之基础面试题-常见的几种排序算法-插入、选择、冒泡、快排、堆排等
常见的几种排序算法-插入.选择.冒泡.快排.堆排: https://blog.csdn.net/zhangerqing/article/details/8831542
- 【软件】[Qt\C++] 冒泡、希尔、堆排、基数、快排 5种排序Gui界面带对比——使用Qt实现
完整代码 https://github.com/gongfpp/sortsWithQt 成品(随机生成数字后全过了一遍) 一. 实验任务(实验题目.目的) 实现5种排序(冒泡.希尔.堆排.基数.快排) ...
- 排序算法 | 快排、冒泡、堆排、归并、基数、递归、希尔、计数
文章目录 写在前面 排序 1. 基数排序`稳定` 2. 归并排序`稳定`merge sort 3. 快速排序`不稳定`quick sort 4. 堆排序`不稳定`heap sort 大根堆 小根堆 5 ...
- 数据结构与算法(C++)– 堆排(Heap Sort)
堆排(Heap Sort) 1.概念 完全二叉树特点: 对于完全二叉树中任一点 i: 左孩子的位置为: 2i 右孩子的位置为:2i+1 父节点位置为:i/2 向下取整 最小二叉堆:根节点的值小于子树的 ...
- 堆排HeapSort
堆排序是一种树形选择排序,是对直接选择排序的有效改进. 堆的构建-->堆排: 1.算法思想 堆:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆. ...
- 旋转数组的最小数字+堆排介绍19.9.14
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...
最新文章
- Ctex软件介绍安装破解(是WinEdt_v6.0破解)
- BZOJ2498 : Xavier is Learning to Count
- Android - 广播机制和Service
- C# Lambda 和 匿名函数的GC总结
- 安装python要注意什么_安装python注意事项
- 百世快递收到纽交所退市警告!国内业务已68亿“卖身”
- cadence中集成hspice
- Eclipse安装好后快捷方式无法在桌面上打开,在Eclipse文件夹里可以正常打开。
- 银行IT系统整体架构
- k8s ceph rbd动态挂载
- ffmpeg生成透明背景视频
- 【转】linux电源框架——Regulator
- [转载]625线,525线什么意思?
- Mac电脑上Android Studio自带模拟器无法关闭
- C#微信开放平台开发——1、序言
- VR学习第九节:VR+旅游 VR+房地产
- 《微机原理第五版》期末知识总结(第五章---第七章)
- 2022年终总结与展望
- 操作系统——放置策略
- 天润融通入选最具活力云计算服务商,拔得呼叫中心领域头筹
热门文章
- 解决样本类别不平衡以及困难样本问题的方法总结
- 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA
- Scalaz(58)- scalaz-stream: fs2-并行运算示范,fs2 parallel processing
- [WPF系列]-DynamicResource与StaticResource的区别
- NSString与NSData互转
- 冬季巧食生姜可提高免疫力
- Dynamics 365 CRM Connected Field Service 自动发送command
- Angular项目构建指南 - 不再为angular构建而犹豫不决(转)
- myeclipse生成getset注释
- 在Windows 7 下使用Visual Studio 2010 编写自动申请管理员权限运行的程序