首页 > 其他分享 >排序

排序

时间:2024-11-14 18:29:37浏览次数:1  
标签:结点 下坠 建堆 堆排序 排序 复杂度

堆排序

  1. 什么是堆?
    • 从存储视角来看就是数组,逻辑视角上看是一个顺序存储的"完全二叉树",大根堆是根>=左右孩子结点,小根堆是根<=左右孩子结点。
  2. 什么是堆排序?
  3. 如何建堆?
  4. 如何基于堆排序?
  5. 堆排序算法效率分析
    • 时间复杂度
      • 排序的时间开销花费主要是两方面,一是比较二是交换,堆排序的时间开销在,建堆和排序和调整堆
      • 建堆时,需要比较当前结点(比较一次)和孩子结点中较大(比较一次)的一个,进行下坠,若树高为h,当前结点在第i层,此结点最多下坠2(h - i)层,关键字对比次数不超过2(h - i),第i层最多有2^i - 1个结点,只有1 ~ h - 1层的结点需要下坠,进行累加的出结果是<= 4n,那么关键字对比次数不超过4n,建堆时间复杂度为O(n)。
      • 排序后并调整堆时,需要将堆顶结点和最后一个结点交换,交换后再进行调整堆,调整堆时根结点进行下坠,最多下坠h - 1层,每下坠一层最多对比两次。因此一趟排序的时间复杂度为O(2h) = O(2logn) =O(logn),每趟排好序一个元素,最终n个元素有序,则需要排序n - 1趟,则总的时间复杂度为O(nlogn)。
      • 所以建堆+排序+调整堆的总的时间复杂度为O(n) + O(nlogn) = O(nlogn)               
    • 空间复杂度
      • 常数级的空间占用,空间复杂度为O(1)  
  6. 堆排序的稳定性
    • 比如像212这种情况,建立完大根堆后进行排序,此时第一个2会跑到最后,此时第一个2和第二个2的相对顺序在排序前后发生了变化,这就是不稳定的体现。                                                                     

标签:结点,下坠,建堆,堆排序,排序,复杂度
From: https://www.cnblogs.com/complexlong/p/18546539

相关文章

  • 冒泡排序来啦
    哈哈上一个帖子确实有一个错误的哈,而且还很明显!!(我竟然把交换两个数的部分写错了,就上个帖子......
  • cxGrid【过滤、排序】后获取选中记录的值和cxGrid空表判断
    方法一:使用函数GetRowValue此方法在表格过滤、排序后也正常,请注意:此代码顺序需要CXGRID的列顺序和ADOQUERY中SELECT的字段顺序一致,否则会取错。procedureTfrmBillExtraction.pmGetBill_D_DatasClick(Sender:TObject);varI,J:Integer;beginwithcxGDBTV_Bill_M.Data......
  • cmu15545笔记-排序和聚合算法(Sorting&Aggregation Algorithms)
    目录概述排序堆排序外部归并排序使用索引聚合操作排序聚合哈希聚合概述本节和下一节讨论具体的操作算子,包括排序,聚合,Join等。排序为什么需要排序操作:关系型数据库是无序的,但是使用时往往需要顺序数据(OrderedBy,GroupBy,Distinct)。主要矛盾:磁盘很大:要排序的数据集很大,内......
  • # issue 2 选择排序(Selection Sort)
    目录一、SelectionSort的基本思路二、SelectionSort的各个复杂度三、SelectionSort的实现四、实验结果(输出结果)一、SelectionSort的基本思路通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小(最大)的记录,并和第i(1<=i<=n)个记录交换嗯,说人话就是例如从......
  • 选择排序法——堆排序
    任务描述本关任务:完成建堆、排序调整及输出排序结果的函数。相关知识为了既要保存中间比较结果,减少后面的比较次数,又不占用大量的附加存储空间,使选择排序算法具有较好的性能,Willioms和Floyd在1964年提出的称为堆排序的算法实现了这一想法。 堆排序包括以下关键部分:1.建初......
  • Hive的分区和排序
    一、Hive的分区(十分重要)1、分区是什么答:我们可以把一个大的文件分隔成一个个小的文件,这样每次操作一个小文件就很方便了2、为什么要进行分区答:通过分区,当我们查询的时候,可以只扫描与条件相关的分区,这样做,避免了全局扫描,加快查询速度1、静态分区(SP)静态分区指的是,在我们将数......
  • javascript如何进行冒泡排序?
    冒泡排序的规律有一个数组[5,4,3,2,1],假如说要重新排序,进行升序排序,冒泡排序步骤如下5和4比较,5大,5和4交换位置[4,5,3,2,1]5和3比较,5大,5和3交换位置[4,3,5,2,1]5和2比较,5大。5和2交换位置[4,3,2,5,1]5和1比较,5大,5和1交换位置[4,3,2,1,5]5排到了最后一位4开始和后面的......
  • MapReduce初级编程实践:编写程序实现对输入文件的排序
     实验环境:操作系统:Linux(Centos7);  Xsell7Hadoop版本:3.4.0(这里的版本根据自己的修改,可能小部分版本的Hadoop不适用于本文实验)现在有多个输入文件,每个文件中的每行内容均为一个整数。要求读取所有文件中的整数,进行升序排序后,输出到一个新的文件中,输出的数据格式为每行两......
  • Leetcode 148. 排序链表
    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。经典的分治算法应用,通过归并进行排序,需要用到一个与原数组相同长度的数组归(分割)思想如上图所示,代码实现通过快慢指针来寻找链表的中点来分割指针varspilitList=function(head){if(head===......
  • 学习日历day02 分治法-归并排序(递归版)
    归并排序快速排序类似于二叉树前序遍历(根节点、左子节点、右子节点)归并排序类似于二叉树后序遍历(左子节点、右子节点、根节点)归并排序的递归实现归并排序:持续分割区间,直到剩下最后一个节点,在归并排序的过程中,数组的分割可以看作是在构建一棵二叉树。具体来说,每次分割都将当......