首页 > 其他分享 >堆排序

堆排序

时间:2022-09-26 11:26:19浏览次数:50  
标签:大顶 结点 堆排序 元素 交换 arr 末尾

  • 简介
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。 
每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆
  • 大顶堆

  • 对堆中的结点按层进行编号,映射到数组中

  • 大顶堆特点:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] // i 对应第几个节点,i从0开始编号

  • 小顶堆

  • 小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2] // i 对应第几个节点,i从0开始编号

  • 一般升序采用大顶堆,降序采用小顶堆

  • 堆排序思想

将待排序序列构造成一个大顶堆 
此时,整个序列的最大值就是堆顶的根节点。 
将其与末尾元素进行交换,此时末尾就为最大值。 
然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。  
可以看到在构建大顶堆的过程中,元素的个数逐渐减少,最后就得到一个有序序列了.
  • 应用实例
给你一个数组 {4,6,8,5,9} , 要求使用堆排序法,将数组升序排序
  • 实现步骤
将数组按层级映射为1个二叉树

此时我们从最后一个非叶子结点开始(叶结点自然不用调整,第一个非叶子结点arr.length/2-1=5/2-1=1,也就是下面的 6 结点),从左至右,从下至上进行调整

找到第二个非叶节点 4,由于[4,9,8]中 9 元素最大,4 和 9 交换

这时,交换导致了子根[4,5,6]结构混乱,继续调整,[4,5,6]中 6 最大,交换 4 和 6

此时,我们就将一个无序序列构造成了一个大顶堆

步骤二 将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换得到第二大元素。如此反复进行交换、重建、交换
将堆顶元素 9 和末尾元素 4 进行交换

重新调整结构,使其继续满足堆定义

再将堆顶元素 8 与末尾元素 5 进行交换,得到第二大元素 8

后续过程,继续进行调整,交换,如此反复进行,最终使得整个序列有序

# 总结
将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;
将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序

标签:大顶,结点,堆排序,元素,交换,arr,末尾
From: https://www.cnblogs.com/chniny/p/16730198.html

相关文章

  • ac 838堆排序
    这里是维护一个m大小的堆,每一个比堆顶小的数字都放进来进行一次heapify。题目的意思我以为是只需要输出前m小的数字不需要排序,但是看答案意思需要,所以最后麻烦了一下#inc......
  • 堆排序
    voidHeapSort(intarr[],intstart,intend){ intdad=start; intson=dad*2+1; while(son<=end) { if(son+1<=end&&arr[son]<arr[son+1]) son++;......
  • 堆排序
    packagecom.lianzhu.filemanage.utils;importjava.util.Stack;/***栈排序*@description:栈的特性:先进后出如空数组【】*@step1:有一串数字4,8,7,9,2,6......
  • 堆排序 与 比较器
    堆排序假如给你一无序的数组,经过堆排序获得一组降序的数组1、首先我们将数组遍历,进行heapInsert,变为一个大根堆,建立堆的过程方法一:正序遍历+heapInsertO(N*logN)当需......
  • 经典排序之堆排序
    堆排序思路堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分......
  • 由浅入深!一文带你彻底明白堆排序
    本文中所有的代码全都是大根堆!实现语言是Java图片来源都是这位大神的,大神的文章也给了我很多启发数据结构之堆堆排序这个视频通俗易懂从什么是堆,什么是堆化,再到实现......
  • 十大排序算法之【堆排序】
    堆排序代码://头文件省略voidheapify(vector<int>&in,intbottom,inttop){intlargest=top;intlson=top*2+1;intrson=top*2+1;if(lson......
  • 快速排序和堆排序
    python快速排序、堆排序、计数排序、桶排序、基数排序_一只什么都不懂的码农的博客常用排序算法总结和对比_玖玖拾月陆的博客-CSDN博客_各种排序算法的总结和比较#快速......