十种排序算法——堆排序(小顶堆)

首先要了解什么是堆?小顶堆又是什么?而堆排序是十种排序种唯一种自定义的数据结构

这里的堆就是我们所熟悉的二叉树

而小顶堆又是什么呢?

小顶堆就是根节点比子节点小,子节点比叶子节点小。

所以我们第一步是进行堆化,从它倒数第一个子节点进行堆化(从右到左)

它检查完了之后它的兄弟节点再检查
在进行交换子节点始终比叶子节点小

当交换完成之后再返回它的父节点进行检查

请注意在每次交换完成之后好要下沉,看一下它的子节点或者是叶子节点是否有比它小的


当下沉完成之后,同理在检查它的兄弟节点

当检查完之后再返回它的子节点,子节点进行下沉

到这里我们堆化完成了接下来,把堆顶0号元素和最后一位元素对调


对调完成之后,不在考虑它对调的那个位置了
在进行向下调整

然后根节点再和最后那个位置交换了(注意不考虑之前交换的位置)

在继续下沉,和最后可以考虑的位置进行交换
最后就交换下沉就如下图所示

在输出就可以了

import java.util.Scanner;public class _堆排序小顶堆 {public static void main(String[] args) {Scanner sc =new Scanner(System.in);
//           int n=sc.nextInt();int A[]  = {1,2,9,7,6,3,4,2};sort(A);for (int i = 0; i < A.length; i++) {System.out.print(A[i]+" ");}     }public static void MinHeap(int[] A) {int n=A.length;for (int i=n/2-1;i>=0; i--) {MinHeapFixDown(A,i,n);}}private static void MinHeapFixDown(int[] A,int i,int n) {//找到左右孩子int left = i*2+1;int right= i*2+2;//如果左孩子已经越界,i就是叶子节点if(left>=n)return; int min=left;if(right<n){if(A[right]<A[left]) {min=right;}} //min指向了left和right中的最小的那个//如果A[i]比两个孩子小不用调整if(A[i]<=A[min])return;//否则找到两个孩子小的那个和i交换int temp = A[i];A[i]=A[min];A[min]=temp;//小孩子那个位置的值发生变化,i变更小孩子的那个位置,进行递归调整MinHeapFixDown(A, min,n);}private static void sort(int[] A) {//向对A进行堆化MinHeap(A);//把堆顶0号元素和最后一位元素对调for (int x =A.length-1;x>=0 ; x--) {int  temp=A[0];A[0]=A[x];A[x]=temp;//缩小堆的范围,对堆顶进行向下调整MinHeapFixDown(A,0,x);}}
}

算法 十大排序 堆排序相关推荐

  1. 排序算法——十大排序算法的图示与实现

    十大排序算法概览 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于 ...

  2. 排序算法——十大排序算法总结与对比

    一.十大排序算法复杂度对比 二.关于排序算法的总结 1.基数排序仅仅适用于整型数的排序,一般不与另外的排序方法一起比较. 2.关于算法的稳定性:不稳定的算法有 "快希选堆"--快速 ...

  3. 数据结构与算法——十大排序

    排序 1.排序的基本定义 排序:就是使一串记录,按照其中的某个或者某些关键字的大小,递增或递减的排列起来的操作. 排序算法:就是如何使得记录按照要求排列的方法.排序算法在很多领域都得到很大的重视,尤其 ...

  4. c++十大排序——堆排序

    1.堆排序 堆排序采用堆的这种数据结构,堆首先是一颗完全二叉树. 堆又分为大顶堆和小顶堆 大顶堆就是父节点数值大于等于左右节点数值 小顶堆是父节点数值小于等于左右节点数值 下标为i的节点的父节点下表为 ...

  5. 十大排序算法之堆排序

    十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...

  6. 数据结构与算法:十大排序算法之堆排序

    数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...

  7. 这或许是东半球分析十大排序算法最好的一篇文章

    作者 | 不该相遇在秋天 转载自五分钟学算法(ID:CXYxiaowu) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强 ...

  8. 「干货总结」程序员必知必会的十大排序算法

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 绪论 身 ...

  9. 「归纳|总结」程序员必知必会的十大排序算法

    微信搜一搜「bigsai」关注这个有趣的程序员 新人原创公众号,求支持一下!你的点赞三连肯定对我至关重要! 文章已收录在 我的Github bigsai-algorithm 欢迎star 本文目录 绪 ...

最新文章

  1. 美多商城之购物车(购物车存储方案)
  2. mysql 哈希缓存_MySQL Buffer Pool
  3. IE和DOM事件流、普通事件和绑定事件的区别
  4. typecho 去掉index.php,typecho如何去掉index.php
  5. 最大公约数python语言算法_使用Python求解最大公约数的实现方法
  6. IIS与Apache同时使用80端口
  7. 滑轮控件研究四、VelocityTracker的简单研究
  8. eclipse及tomcat设置编码
  9. 超强OCR文字识别软件,图片转文字上班族必备
  10. 如何安装 btsync
  11. android局域网 nas,华为手机通过群晖NAS备份时提示“本机和您的NAS设备需处于同一局域网”的解决方法...
  12. kitti数据集calib.txt文件
  13. 纸张大小、规格、度量详解
  14. CDN与智能DNS 基本原理
  15. opencv绘制椭圆
  16. 手机加密聊天软件功能文档(基于android系统)
  17. 如何将1000页PPT单独导出为1000个单独的文件?又如何快速把多个PPT合成一个?
  18. 用java画哆啦a梦,来画哆啦A梦吧!
  19. rancher k8s集群pod一直处于Pending状态
  20. 远程关闭计算机提示拒绝访问权限,shutdown远程关机win10系统拒绝访问最佳解决方法...

热门文章

  1. 10.3 英语听力练习
  2. AUV运动描述模型建立(1)
  3. Linux 设备总线驱动模型(转载)
  4. Mysql 截取字符串
  5. 关于魅族note无法连接mac调试
  6. 推广一款不错的应用“锁屏对对碰”
  7. Ubantu系统一些设置
  8. 我的世界服务器死亡信息在哪看,我的世界:死亡记录点?不需要地图,就可以看到“死”在哪里!...
  9. android l 发布,Android L发布:细说Android甜品进化史
  10. 福布斯:加密货币正准备从根本上改变金融