首页 > 其他分享 >堆排序(Heap sort)

堆排序(Heap sort)

时间:2024-05-31 11:00:19浏览次数:14  
标签:sort 大根堆 last int 堆排序 Heap 节点 调整

堆排序

堆排序是简单选择排序的改进,改进点为如何让减少在选择的过程中比较的次数。

1.堆的定义

       堆是具有以下性质的完全二叉树:每个结点的值都大于(小于)等于其孩子节点的值,称为大根堆(小根堆)。

例:

      由堆的定义得知堆顶元素一定为最大(大根堆)或者最小值(小根堆)。

2.调整算法。

       首先将根节点与左右孩子节点相比较,如果符合根节点最大(大根堆的定义)不调整,如果孩子比根节点大,选择孩子节点中最大的与根节点交换。经过交换,破坏了被交换子树的堆结构,须再对被交换子树进行堆排序直到i为叶子节点。注意:堆的调整算法不是一次调整就将无序的数据调成堆。是在根节点的左右子树均是堆时,进行一次调整才时堆。

算法:Sift(int k,int last,int a[])//构建大根堆的调整算法

输入:待调整数组a[k]~a[last],且a[k+1]~a[last]满足堆的条件

输出:无

  1. 设变量i,j分别指向当前要调整的及其左孩子节点
  2. 若节点i是叶子节点则结束;否则执行下列操作;
    1. 将j指向i的孩子节点中比较大的值
    2. 如果data[i]>data[j],调整结束
    3. 如果data[i]<data[j],则将data[i]与data[j]交换;

令i=j,j=j=2i+1(该操作是向下一层调整),循环步骤2

       例:第一次调整破坏左子树,需要向下继续调整。如果·第一次比较符合堆定义则结束。注该函数为堆的调整函数,不是直接初始化堆(堆的初始化可能需要多次堆的调整)。

3.堆排序

是基于对的特性进行排序。

3.1基本思想

      3.1.1将待排序列调整为堆,此时根节点为最大元素从最下层出度不为0的最后一个节点开始调整sift(i=ceil(length/2)-1,last)循环i--(i是完全二叉树最下层出度不为0的最后一个节点)。

       3.1.2将堆顶元素(将树的最后一个节点与根节点交换(排序过的节点不在树中),此时根节点的左右子树仍是 大根堆)移走将剩余记录再调成堆。重复该操作。

3.2堆排序实现

代码在Dev-C++5.11编程环境下调试。

#include<iostream>
using namespace std;

void Shit(int k,int last,int a[])//如果是降序排列只需要建立小根堆

{

                      int i,j,temp;

                      i=k,j=2*i+1;

                      while(j<=last)

                      {

                            if(j<last&&a[j]<a[j+1])j++;

                            if(a[i]>a[j]) break;//已经是堆

                            else{

                                   temp=a[i];

                                   a[i]=a[j];

                                   a[j]=temp;

                                   i=j;j=2*i+1;

                            }

                      }

}



void HeapSort(int a[],int length)

{

                      int i,temp;

                      for(int i=length/2-1;i>=0;i--)//初始化大根堆 从完全二叉树最后一层最后一个出度不为0的·分支节点开始调整,直至到根结点

                      {

                            Shit(i,length-1,a);

                      }

          
                      for(i=1;i<length;i++)//依次选取最大的元素到

                      {

                      temp=a[0];

                      a[0]=a[length-i];

                      a[length-i]=temp;//堆顶和堆中最后一个元素位置交换

                      Shit(0,length-1-i,a);//交换后堆的调整

                      }

 }


int main()

{
                      int a[]={4,5,989,7,9756,464,77,645,46,54,89,7645};

                      HeapSort(a,12);

                      for(int q=0;q<12;q++)

                      {

                            cout<<a[q]<<"\t";

                      }                    
}

标签:sort,大根堆,last,int,堆排序,Heap,节点,调整
From: https://blog.csdn.net/2301_81588362/article/details/139346361

相关文章

  • LeetCode 1329. Sort the Matrix Diagonally
    原题链接在这里:https://leetcode.com/problems/sort-the-matrix-diagonally/description/题目:A matrixdiagonal isadiagonallineofcellsstartingfromsomecellineitherthetopmostroworleftmostcolumnandgoinginthebottom-rightdirectionuntilreachin......
  • NameCheap域名怎么样,如何注册购买域名?如何解析域名?
    Namecheap介绍Namecheap是一家国外域名注册商和网站托管公司,成立于2000年,提供域名注册、虚拟主机、电子邮件托管、SSL证书、免费的WHOIS保护、CDN、VPS主机和独立服务器。Namecheap怎么样?在Namecheap中注册、购买域名也是不需要备案的,价格方面相对于Namesilo来说也会便宜许多,操......
  • 七大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、归并排序、快速排序
    以下内容转载自文章1.插入排序步骤:1.从第一个元素开始,该元素可以认为已经被排序2.取下一个元素tem,从已排序的元素序列从后往前扫描3.如果该元素大于tem,则将该元素移到下一位4.重复步骤3,直到找到已排序元素中小于等于tem的元素5.tem插入到该元素的后面,如果已排序所有元......
  • Python3 笔记:sort() 和 sorted() 的区别
    1、sort()可以对列表中的元素进行排序,会改变原列表,之前的顺序不复存在。list.sort(key,reverse=None) key:默认值是None,可指定项目进行排序,此参数可省略。 reverse:默认值是None指做升序排序,“reverse=True”则做降序排序。无论列表中的元素是数值还是字符串都能排序,但......
  • elasticsearch使用Sort排序时Please use a keyword field instead.
    具体报错信息ElasticsearchStatusException[Elasticsearchexception[type=search_phase_execution_exception,reason=allshardsfailed]];nested:ElasticsearchException[Elasticsearchexception[type=illegal_argument_exception,reason=Textfieldsarenotoptimised......
  • 9-4 file-sort命令的使用
    9.4.1file查看文件file命令作用:file-determinefiletype #确定文件类型用法:file/etc/passwd注:linux系统不根据后缀名识别文件类型用file命令查看文件的类型 9.4.2按一定规则排序查看文件查看文件:ls-ltr:按时间排序 t......
  • PWN系列-Unsorted Bin Attack
    PWN系列-UnsortedBinAttack概述UnsortedBinAttack,顾名思义,该攻击与Glibc堆管理中的的UnsortedBin的机制紧密相关。UnsortedBinAttack被利用的前提是控制UnsortedBinChunk的bk指针。UnsortedBinAttack可以达到的效果是实现修改任意地址值为一个较大的数值......
  • 解决yarn打包时出现“FATAL ERROR: Reached heap limit Allocation failed - JavaScri
    1、......
  • redis数据结构:RedisObject,SkipList,SortedSet
    1.RedisObject对象redis中任何KV都会被封装为RedisObject对象,也叫做Redis对象 2.SkipList跳表元素按照升序排列存储,是有序的双向链表节点可以有多个指针,并且跨度不同。指针个数根据节点数自动生成,1~32性能和红黑树;二分查找差不多。实现简单,但是空间复杂度高样例:1——2......
  • JavaScript object array sort by string bug All In One
    JavaScriptobjectarraysortbystringbugAllInOnebug//purestringsarray,sortOK✅letarr=["banana","strawberry","apple"];JSON.stringify(arr.sort());//'["apple","banana","strawbe......