算法 十大排序 堆排序
十种排序算法——堆排序(小顶堆)
首先要了解什么是堆?小顶堆又是什么?而堆排序是十种排序种唯一种自定义的数据结构
这里的堆就是我们所熟悉的二叉树
而小顶堆又是什么呢?
小顶堆就是根节点比子节点小,子节点比叶子节点小。
所以我们第一步是进行堆化,从它倒数第一个子节点进行堆化(从右到左)
它检查完了之后它的兄弟节点再检查
在进行交换子节点始终比叶子节点小
当交换完成之后再返回它的父节点进行检查
请注意在每次交换完成之后好要下沉,看一下它的子节点或者是叶子节点是否有比它小的
当下沉完成之后,同理在检查它的兄弟节点
当检查完之后再返回它的子节点,子节点进行下沉
到这里我们堆化完成了接下来,把堆顶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);}}
}
算法 十大排序 堆排序相关推荐
- 排序算法——十大排序算法的图示与实现
十大排序算法概览 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于 ...
- 排序算法——十大排序算法总结与对比
一.十大排序算法复杂度对比 二.关于排序算法的总结 1.基数排序仅仅适用于整型数的排序,一般不与另外的排序方法一起比较. 2.关于算法的稳定性:不稳定的算法有 "快希选堆"--快速 ...
- 数据结构与算法——十大排序
排序 1.排序的基本定义 排序:就是使一串记录,按照其中的某个或者某些关键字的大小,递增或递减的排列起来的操作. 排序算法:就是如何使得记录按照要求排列的方法.排序算法在很多领域都得到很大的重视,尤其 ...
- c++十大排序——堆排序
1.堆排序 堆排序采用堆的这种数据结构,堆首先是一颗完全二叉树. 堆又分为大顶堆和小顶堆 大顶堆就是父节点数值大于等于左右节点数值 小顶堆是父节点数值小于等于左右节点数值 下标为i的节点的父节点下表为 ...
- 十大排序算法之堆排序
十大排序算法之堆排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:所谓堆排序就是通过构造最大堆(升序)或者最小堆(降序)来进行排列的方法.可能有些童鞋不知道何为最大堆,何为最小堆.这 ...
- 数据结构与算法:十大排序算法之堆排序
数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...
- 这或许是东半球分析十大排序算法最好的一篇文章
作者 | 不该相遇在秋天 转载自五分钟学算法(ID:CXYxiaowu) 前言 本文全长 14237 字,配有 70 张图片和动画,和你一起一步步看懂排序算法的运行过程. 预计阅读时间 47 分钟,强 ...
- 「干货总结」程序员必知必会的十大排序算法
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 绪论 身 ...
- 「归纳|总结」程序员必知必会的十大排序算法
微信搜一搜「bigsai」关注这个有趣的程序员 新人原创公众号,求支持一下!你的点赞三连肯定对我至关重要! 文章已收录在 我的Github bigsai-algorithm 欢迎star 本文目录 绪 ...
最新文章
- 美多商城之购物车(购物车存储方案)
- mysql 哈希缓存_MySQL Buffer Pool
- IE和DOM事件流、普通事件和绑定事件的区别
- typecho 去掉index.php,typecho如何去掉index.php
- 最大公约数python语言算法_使用Python求解最大公约数的实现方法
- IIS与Apache同时使用80端口
- 滑轮控件研究四、VelocityTracker的简单研究
- eclipse及tomcat设置编码
- 超强OCR文字识别软件,图片转文字上班族必备
- 如何安装 btsync
- android局域网 nas,华为手机通过群晖NAS备份时提示“本机和您的NAS设备需处于同一局域网”的解决方法...
- kitti数据集calib.txt文件
- 纸张大小、规格、度量详解
- CDN与智能DNS 基本原理
- opencv绘制椭圆
- 手机加密聊天软件功能文档(基于android系统)
- 如何将1000页PPT单独导出为1000个单独的文件?又如何快速把多个PPT合成一个?
- 用java画哆啦a梦,来画哆啦A梦吧!
- rancher k8s集群pod一直处于Pending状态
- 远程关闭计算机提示拒绝访问权限,shutdown远程关机win10系统拒绝访问最佳解决方法...
热门文章
- 10.3 英语听力练习
- AUV运动描述模型建立(1)
- Linux 设备总线驱动模型(转载)
- Mysql 截取字符串
- 关于魅族note无法连接mac调试
- 推广一款不错的应用“锁屏对对碰”
- Ubantu系统一些设置
- 我的世界服务器死亡信息在哪看,我的世界:死亡记录点?不需要地图,就可以看到“死”在哪里!...
- android l 发布,Android L发布:细说Android甜品进化史
- 福布斯:加密货币正准备从根本上改变金融