Python 实现快排、堆排


1、快排

原理:(升序)

  1. 选取数组的首个元素做为中间值,缓存这个中间值,该位置变为空;
  2. 从右到左和中间值对比,找到第一个小于中间值的元素,把该值放到左边的空位,该位置变为空;
  3. 从左到右和中间值对比,找到第一个大于中间值的元素,把该值放到右边的空位,该位置变为空;
  4. 重复步骤2和3,直到左右空位相交,然后把缓存的中间值填入该位;
  5. 从第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、堆排

原理(用数组表示完全二叉树的层序,最小堆):

  1. 从最后一个叶子节点的父节点开始,比较该节点与子节点的大小;
  2. 如果父节点是最小值,继续比较前面的节点;如果父节点不是最小值,父节点与最小值节点交换位置,并且考虑该变换对最小值节点的子节点的影响;
  3. 直到比较到根节点

程序代码:

# 堆排
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 实现快排、堆排相关推荐

  1. 快排堆排归排三种排序的比较

    目录 快排 堆排序 归并排序 三种排序的比较 快排 快速排序中最简单的(递归调用) 注:倒序,和 列表中有大量重复元素时,时间复杂度很大 快排例子 注:快排代码实现(类似于二叉树 递归调用) 时间复杂 ...

  2. 【LeetCode笔记】215. 数组中的第K个最大元素(Java、快排、堆排、并发快排)

    文章目录 题目描述 思路 & 代码 快排 基于 Fork / Join 的并发快排 针对 topK 的快排优化 堆排 基本堆排 结合题目的堆排 二刷 题目描述 大名鼎鼎的TOP K,主要考察排 ...

  3. python实现快排算法(quicksort)

    python实现快排算法(quicksort) 快速排序是对冒泡排序的一种改进.它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后 ...

  4. Java面试宝典系列之基础面试题-常见的几种排序算法-插入、选择、冒泡、快排、堆排等

    常见的几种排序算法-插入.选择.冒泡.快排.堆排: https://blog.csdn.net/zhangerqing/article/details/8831542

  5. 【软件】[Qt\C++] 冒泡、希尔、堆排、基数、快排 5种排序Gui界面带对比——使用Qt实现

    完整代码 https://github.com/gongfpp/sortsWithQt 成品(随机生成数字后全过了一遍) 一. 实验任务(实验题目.目的) 实现5种排序(冒泡.希尔.堆排.基数.快排) ...

  6. 排序算法 | 快排、冒泡、堆排、归并、基数、递归、希尔、计数

    文章目录 写在前面 排序 1. 基数排序`稳定` 2. 归并排序`稳定`merge sort 3. 快速排序`不稳定`quick sort 4. 堆排序`不稳定`heap sort 大根堆 小根堆 5 ...

  7. 数据结构与算法(C++)– 堆排(Heap Sort)

    堆排(Heap Sort) 1.概念 完全二叉树特点: 对于完全二叉树中任一点 i: 左孩子的位置为: 2i 右孩子的位置为:2i+1 父节点位置为:i/2 向下取整 最小二叉堆:根节点的值小于子树的 ...

  8. 堆排HeapSort

                堆排序是一种树形选择排序,是对直接选择排序的有效改进. 堆的构建-->堆排: 1.算法思想 堆:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆. ...

  9. 旋转数组的最小数字+堆排介绍19.9.14

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...

最新文章

  1. Ctex软件介绍安装破解(是WinEdt_v6.0破解)
  2. BZOJ2498 : Xavier is Learning to Count
  3. Android - 广播机制和Service
  4. C# Lambda 和 匿名函数的GC总结
  5. 安装python要注意什么_安装python注意事项
  6. 百世快递收到纽交所退市警告!国内业务已68亿“卖身”
  7. cadence中集成hspice
  8. Eclipse安装好后快捷方式无法在桌面上打开,在Eclipse文件夹里可以正常打开。
  9. 银行IT系统整体架构
  10. k8s ceph rbd动态挂载
  11. ffmpeg生成透明背景视频
  12. 【转】linux电源框架——Regulator
  13. [转载]625线,525线什么意思?
  14. Mac电脑上Android Studio自带模拟器无法关闭
  15. C#微信开放平台开发——1、序言
  16. VR学习第九节:VR+旅游 VR+房地产
  17. 《微机原理第五版》期末知识总结(第五章---第七章)
  18. 2022年终总结与展望
  19. 操作系统——放置策略
  20. 天润融通入选最具活力云计算服务商,拔得呼叫中心领域头筹

热门文章

  1. 解决样本类别不平衡以及困难样本问题的方法总结
  2. 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA
  3. Scalaz(58)- scalaz-stream: fs2-并行运算示范,fs2 parallel processing
  4. [WPF系列]-DynamicResource与StaticResource的区别
  5. NSString与NSData互转
  6. 冬季巧食生姜可提高免疫力
  7. Dynamics 365 CRM Connected Field Service 自动发送command
  8. Angular项目构建指南 - 不再为angular构建而犹豫不决(转)
  9. myeclipse生成getset注释
  10. 在Windows 7 下使用Visual Studio 2010 编写自动申请管理员权限运行的程序