精华内容
下载资源
问答
  • 堆排序第一趟遍历序列

    千次阅读 多人点赞 2020-11-28 14:43:44
    初始序列:56、30、71、29、97、83、74、64 、 76、 48

    初始序列:56、30、71、29、97、83、74、64 、 76、 48

    展开全文
  • 初始和堆排序

    千次阅读 2019-03-09 00:15:04
    最近刷笔试题的时候遇到:某堆初始化...所以对进行初始化,只是找出了第一个最大的(最大),或者最小的值(最小)。 举个例子:设有一个无序序列 { 1, 3, 4, 5, 2, 6, 9, 7, 8, 0 }。(接下来参考大佬的博客...

    最近刷笔试题的时候遇到:某堆初始化的结果,某堆排序后的结果。

    之前学数据结构的时候已经学过,然而没有牢固的影响,在这里做笔记。以免自己再忘却。

     

     

    首先,堆是完全二叉树却不是二叉查找树。

    所以对堆进行初始化,只是找出了第一个最大的(最大堆),或者最小的值(最小堆)。

    举个例子:设有一个无序序列 { 1, 3, 4, 5, 2, 6, 9, 7, 8, 0 }。(接下来参考大佬的博客的图)

    很明确的看出来:

    先建立一个完全二叉树。

    建树之后按照从最后往前的顺序,不断的进行一个选择交换。

    最终找到了最大的交换到了根节点。(这也就是为什么堆排序是选择排序。它都是每次找到最大或者最小)

    上面就完成了堆的初始化。

    所以初始化后的序列【9,8,6,7,2,1,4,3,5,0】

     

    而接下来整个堆排序的过程大概如下:

    1.把根节点和末尾结点交换,并且弹出末尾点。  所以弹出9,这个9就存储进了数组里。 数组第一个值(最大值)就排序好了。

    2.接下来按照初始化的方法,继续排序。

    重复1··2 一直到堆为空。

    至此,每次弹出去的都是最大值,9,8,7,6·······

    整个数组堆排序完成。

    详细图如下:

     

     

     

     

     

     

    展开全文
  • 第一行:初始后的结果 其后各行输出交换顶元素并调整的结果,数据之间用一个空格分隔 Sample Input 10 5 4 8 0 9 3 2 6 7 1 Sample Output 9 7 8 6 4 3 2 5 0 1 8 7 3 6 4 1 2 5 0 9 7 6 3 5 4 1 2 0 8 9 6...
  • 堆初始堆排序

    千次阅读 2017-06-09 17:38:12
     堆排序种选择排序,其时间复杂度为O(nlogn)。 的定义  n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之时,称之为。  情形1:ki 2i 且ki 2i+1 (最小化或小顶堆)  情形2:ki...

        转自http://www.cnblogs.com/mengdd/archive/2012/11/30/2796845.html

     堆排序是一种选择排序,其时间复杂度为O(nlogn)。

    堆的定义

      n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆。

      情形1:k<= k2i 且k<= k2i+1 最小化堆小顶堆

      情形2:k>= k2i 且k>= k2i+1 (最大化堆大顶堆

      其中i=1,2,…,n/2向下取整;

         

                     

     

      若将和此序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左、右孩子结点的值

      由此,若序列{k1,k2,…,kn}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值)。

      例如,下列两个序列为堆,对应的完全二叉树如图:

      

     

      若在输出堆顶的最小值之后,使得剩余n-1个元素的序列重又建成一个堆,则得到n个元素的次小值。如此反复执行,便能得到一个有序序列,这个过程称之为堆排序

      堆排序(Heap Sort)只需要一个记录元素大小的辅助空间(供交换用),每个待排序的记录仅占有一个存储空间。

     

    堆的存储

      一般用数组来表示堆,若根结点存在序号0处, i结点的父结点下标就为(i-1)/2。i结点的左右子结点下标分别为2*i+12*i+2

      (注:如果根结点是从1开始,则左右孩子结点分别是2i和2i+1。)

      如第0个结点左右子结点下标分别为1和2。

      如最大化堆如下:

       

     

      左图为其存储结构,右图为其逻辑结构。

    堆排序的实现

      实现堆排序需要解决两个问题:

        1.如何由一个无序序列建成一个堆?

        2.如何在输出堆顶元素之后,调整剩余元素成为一个新的堆?

     

      先考虑第二个问题,一般在输出堆顶元素之后,视为将这个元素排除,然后用表中最后一个元素填补它的位置,自上向下进行调整:首先将堆顶元素和它的左右子树的根结点进行比较,把最小的元素交换到堆顶;然后顺着被破坏的路径一路调整下去,直至叶子结点,就得到新的堆。

      我们称这个自堆顶至叶子的调整过程为“筛选”。

      从无序序列建立堆的过程就是一个反复“筛选”的过程。

    构造初始堆

      初始化堆的时候是对所有的非叶子结点进行筛选。

      最后一个非终端元素的下标是[n/2]向下取整,所以筛选只需要从第[n/2]向下取整个元素开始,从后往前进行调整。

      比如,给定一个数组,首先根据该数组元素构造一个完全二叉树。

      然后从最后一个非叶子结点开始,每次都是从父结点、左孩子、右孩子中进行比较交换,交换可能会引起孩子结点不满足堆的性质,所以每次交换之后需要重新对被交换的孩子结点进行调整。

    进行堆排序

      有了初始堆之后就可以进行排序了。

      堆排序是一种选择排序。建立的初始堆为初始的无序区。

      排序开始,首先输出堆顶元素(因为它是最值),将堆顶元素和最后一个元素交换,这样,第n个位置(即最后一个位置)作为有序区,前n-1个位置仍是无序区,对无序区进行调整,得到堆之后,再交换堆顶和最后一个元素,这样有序区长度变为2。。。

      不断进行此操作,将剩下的元素重新调整为堆,然后输出堆顶元素到有序区。每次交换都导致无序区-1,有序区+1。不断重复此过程直到有序区长度增长为n-1,排序完成。

    堆排序实例

       首先,建立初始的堆结构如图:

      

      然后,交换堆顶的元素和最后一个元素,此时最后一个位置作为有序区(有序区显示为黄色),然后进行其他无序区的堆调整,重新得到大顶堆后,交换堆顶和倒数第二个元素的位置……

      

      重复此过程:

      

     

      最后,有序区扩展完成即排序完成:

      

     

      由排序过程可见,若想得到升序,则建立大顶堆,若想得到降序,则建立小顶堆

    代码

      假设排列的元素为整型,且元素的关键字为其本身。

      因为要进行升序排列,所以用大顶堆。

      根结点从0开始,所以i结点的左右孩子结点的下标为2i+1和2i+2。

     

    复制代码
    //堆筛选函数
    //已知H[start~end]中除了start之外均满足堆的定义
    //本函数进行调整,使H[start~end]成为一个大顶堆
    typedef int ElemType;
    void HeapAdjust(ElemType H[], int start, int end)
    {
    
        ElemType temp = H[start];
    
        for(int i = 2*start + 1; i<=end; i*=2)
        {
            //因为假设根结点的序号为0而不是1,所以i结点左孩子和右孩子分别为2i+1和2i+2
            if(i<end && H[i]<H[i+1])//左右孩子的比较
            {
                ++i;//i为较大的记录的下标
            }
    
            if(temp > H[i])//左右孩子中获胜者与父亲的比较
            {
                break;
            }
    
            //将孩子结点上位,则以孩子结点的位置进行下一轮的筛选
            H[start]= H[i];
            start = i;
            
        }
    
        H[start]= temp; //插入最开始不和谐的元素
    }
    
    void HeapSort(ElemType A[], int n)
    {
        //先建立大顶堆
        for(int i=n/2; i>=0; --i)
        {
            HeapAdjust(A,i,n);
        }
        //进行排序
        for(int i=n-1; i>0; --i)
        {
            //最后一个元素和第一元素进行交换
            ElemType temp=A[i];
            A[i] = A[0];
            A[0] = temp;
    
            //然后将剩下的无序元素继续调整为大顶堆
            HeapAdjust(A,0,i-1);
        }
    
    }
    复制代码

     

    堆排序分析

      堆排序方法对记录数较少的文件并不值得提倡,但对n较大的文件还是很有效的。因为其运行时间主要耗费在建初始堆和调整建新堆时进行的反复“筛选”上。

      堆排序在最坏的情况下,其时间复杂度也为O(nlogn)。相对于快速排序来说,这是堆排序的最大优点。此外,堆排序仅需一个记录大小的供交换用的辅助存储空间。

     

      参考资料:

      严蔚敏《数据结构》

      http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html

      http://blog.csdn.net/morewindows/article/details/6709644

     


    展开全文
  • 堆排序算法之初始堆建立

    万次阅读 2019-07-01 20:47:54
    以大顶堆为例(初始操作复杂度是 O(n)) 1.首先根据序列构建个完全二叉树 2.在完全二叉树的基础上,从最后个非叶结点开始调整:比较三个元素的大小–自己,它的左孩子,右孩子。分为三种情况: 自己最大,不用...

    以大顶堆为例(初始建堆操作复杂度是 O(n))

    1.首先根据序列构建一个完全二叉树
    2.在完全二叉树的基础上,从最后一个非叶结点开始调整:比较三个元素的大小–自己,它的左孩子,右孩子。分为三种情况:

    • 自己最大,不用调整
    • 左孩子最大,交换该非叶结点与其左孩子的值,并考察以左孩子为根的子树是否满足大顶堆的要求,不满足递归向下处理
    • 右孩子最大,交换该非叶结点与其右孩子的值,并考察以右孩子为根的子树是否满足大顶堆的要求,不满足递归向下处理
    展开全文
  • 堆排序算法之初始堆建立总结

    万次阅读 多人点赞 2016-12-01 23:52:52
    堆排序算法之初始堆建立总结@(算法学习)关于的插入删除有过篇思考,但是关于初始堆的构建,没有总结。简单说就下面几个要点(以大顶堆为例): 首先根据序列构建个完全二叉树 在完全二叉树的基础上,从最后...
  • #include #include #include using namespace std; int n; void dui(int k,int a[]) { int i=k,j=i*2; int item=a[i];... if(ja[j+1]) { j++; } if(item>a[j]) { a[i]=a[j]; i
  • 堆排序(Heapsort)是指利用堆积树()这种数据结构所设计的排序算法,它是选择排序种。可以利用数组的特点快速定位指定索引的元素。分为大根堆和小根,是完全二叉树。 堆排序是将数据看成是完全...
  • 堆排序创建初始堆

    万次阅读 多人点赞 2015-04-01 07:49:17
    最终结果如图1-1(e):
  • :是种特殊的序列 并且 将该序列想象为 完全二叉树 元素满足: (ki <= k2i && ki <= k2i+1) 每个结点一定比它的左右孩子小 (孙子不一定) 这种称为 最小化(小) (树根是最小的) (ki...
  • 堆排序和归并排序

    千次阅读 2017-08-15 11:05:57
    堆排序 1.1 简介 堆排序与快速排序,归并排序一样都是时间复杂度为O(n*logn)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的的定义:n个元素的序列{k1,k2,…,kn}当且仅当满足下列...
  • 认识堆排序排序过程

    万次阅读 2018-02-01 09:40:54
    1)选择排序的基本思想是:每一趟(例如i,i=0,1,2,3,……n-2)在后面n-i个待排序元素中选择排序码最小的元素,作为有序元素序列的i个元素。待到n-2做完,待排序元素只剩下个,就不用再选了。 ...
  • 的定义可以看出,顶元素(即第一个元素)必为最大项。完全二叉树可以很直观地表示的结构。顶为根,其它为左子树、右子树。 初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储顺序,使...
  • 快排希尔排序第一趟的结果

    千次阅读 2017-04-26 21:12:33
    若采用以第一个元素为分界元素的快速排序法,则扫描一的结果是 2 希尔排序,步长默认先从数组长度的一半开始,然后每次减半,直到最后为1 题目所给为4,因此,正好可以分为三组,上来1,5,9号元素(即QQR)...
  • 开门见山,本文讲述堆排序。 就我自身对于排序的了解来看,其实堆排序是诸多排序中最难写的,光是理解起来都有点费劲,本文旨在于用通俗易懂的话,把堆排序娓娓道来。 下面,开始! 1 毫无疑问,排序两个字...
  • 然而,我们知道,如果第一次选中的pivot处在了待排序元素最终结果中的中间位置。那么接下来的处理也是递归进行的, 如图(a)所示,在第一次调用Patition函数后,元素49被放到了最终位置,之后对49左侧位置元素调用...
  • 快排希尔排序第一趟结果

    千次阅读 2018-09-23 18:29:27
    希尔排序 快排
  • 详解堆排序

    2020-07-10 07:56:25
    (1) 堆排序是利用这种数据结构而设计的排序算法,堆排序种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 (2) 是具有以下性质的完全二叉树:每个结点的值都大于或等于其...
  • 堆排序中每次调整后的次序

    千次阅读 2020-04-01 12:01:28
    简单选择排序一趟排序中仅选出最小记录,没有把一趟的比较结果保存下来,因而记录的比较次数较多。堆排序在选出最小记录的同时,也找出较小记录,减少了选择的比较次数,从而提高整个排序的效率。堆排序算法的基本...
  • 堆排序

    万次阅读 多人点赞 2019-06-20 17:29:27
    1、首先了解是什么 种数据结构,种叫做完全二叉树的数据结构。 2、的性质 这里我们用到两种,其实也算是种。 大顶堆:每个节点的值都大于或者等于它的左右子节点的值。 小顶堆:每个节点的值都...
  • 堆排序(C语言实现)

    2021-01-07 17:22:55
    1. 将n个元素建立初始堆第一个节点放在数组下标1中,因此n个节点对应数组 a[1] ~ a[n],第 i 个节点的左孩子节点下标为 2i,右孩子节点为 2i + 1。 找到最后一个非叶子节点: 若节点 i 为最后一个非叶子节点,则 ...
  • 高人能不能讲述一下初始和堆排序的区别是什么呀? 首先建立完全二叉树 45 28 49 16 37 82 56 75 从n/2个节点开始选择,第一趟,16比75小,不换.到n/2-1个节点,49和82、56比,49小,也不换.到n/2-2个结点,28和16、...
  • 图解堆排序(详细推导)

    千次阅读 2020-06-26 16:13:48
    本篇介绍另排序算法——堆排序 文章目录的定义与分类堆排序基本思路图解堆排序过程完整代码片段 的定义与分类 在了解堆排序之前必须了解堆排序的定义,如下: 是具有以下性质的完全二叉树: 1.每个节点的...
  • 调整以及堆排序

    千次阅读 2017-10-07 22:08:20
    利用这种逻辑结构进行排序,难点主要在于创建与调整,利用进行排序无非就是大顶堆(左右孩子节点小于双亲节点)或者小顶堆(左右孩子节点都小于双亲节点)若节点下标从0开始,则每个节点的左孩子为2*i+1;...
  • 特别说明,这里的序列都是从1开始。 1、什么是 ...堆排序种树形选择排序,它的特点是在排序的过程中,将r[1..n]看成是棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点孩子结点之间
  • 堆,建堆,堆排序,堆删除和堆插入

    万次阅读 多人点赞 2018-05-24 23:42:45
    注意:看这篇文章之前,你一定要知道完全二叉树的结构首先要明白一点,种数据结构,队列,链表,树等等个级别。的定义棵节点含有内部比较器的完全二叉树。(说白了,就是完全二叉树,只不过它的...
  • 选择排序堆排序,快速排序都是不稳定的排序算法。 A,冒泡排序 /** * 冒泡排序:每次将相邻两个数比较,如果不满足排序条件则交换位置 * 比较次数:k&amp;amp;gt;=n-1&amp;amp;amp;&amp;amp;amp;k&...
  • 与数组初始状态无关的内排序算法

    千次阅读 2019-07-18 10:44:46
    首先,与初始状态无关分为几种情况 ...【其实还有种就是总排序趟数与初始状态无关,由于分析简单,除了快速排序排序次数(递归深度)与关键字选择(初始状态)有关,还有个优化后的冒泡...
  • 【其实还有种就是总排序数与初始状态无关,由于分析简单,除了快速排序的排序次数(递归深度)与关键字选择(初始状态)有关,还有个优化后的冒泡排序和后序是否有序有关,其他均只与总长度n有关,与初始状态...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 435,739
精华内容 174,295
关键字:

初始堆和第一趟排序