当前位置: 首页 > news >正文

算法导论学习笔记——堆排序

public class HeapSort {

    /**
     * 调整第i个堆元素为根结点的堆为最大堆,前提条件是i的左右孩子已经是最大堆,注意这里的i是在堆中的位置并非数组中的位置
     * @param arr 堆数组
     * @param i  调整第i个堆元素为根结点的堆为最大堆
     * @param heapsize :堆大小即堆中元素个数,在heapSort中会不断的把最大的元素置换出去,
     * 					虽然置换出去的元素仍然在数组中,但是已经不是堆中的元素
     */
	static void maxHeap(int arr[],int i,int heapsize){
		int largest = i;
		int p = 2*i;
		int q = 2*i + 1;
		//由于i和heapsize都是指的元素在堆中的位置而非在数组中的位置,所以涉及到数组操作时都要减1
		if(p<=heapsize&&arr[p-1]>arr[largest-1])
			largest = p;
		if(q<=heapsize&&arr[q-1]>arr[largest-1])
			largest = q;
		if(largest!=i){
			int temp = arr[i-1];
			arr[i-1]=arr[largest-1];
			arr[largest-1]=temp;
			//尽管i的左右孩子已经是最大堆,但是当前面的调整发生以后,其左右孩子就有可能不再是最大堆了,所以要重新调整成最大堆
			maxHeap(arr,largest,heapsize);
		}
	}
	/**
	 * 把一个无序的数组构建成最大堆
	 * @param arr  数组
	 */
	static void buildMaxHeap(int arr[]){
		int length = arr.length/2;
		//尽管i在数组中的位置是从length-1到0,但是这里不能设置为数组中的位置,
		//因为在maxHeap中计算i的左右孩子时是乘2为左孩子,乘2加1为右孩子,
		//如果按数组位置,那么这样的计算就不对了,例如根结点在数组中为0,则其左孩子为2*0=0,这就出错了
		for(int i = length;i>0;i--)
			maxHeap(arr,i,arr.length);
	}
	/**
	 * 最外层的排序函数
	 * @param arr
	 */
	static void heapSort(int arr[]){
		//先把无序的数组建成最大堆
		buildMaxHeap(arr);
		//把堆顶元素输出,把堆最后一个元素放到堆顶,这样输出的最大元素就不在堆中了,但是仍在数组中,所以堆大小要减1
		for(int i = arr.length;i>1;i--){
			int temp = arr[0];
			arr[0]=arr[i-1];
			arr[i-1]=temp;
			maxHeap(arr,1,i-1);
		}
	}
	public static void main(String[] args) {
		int arr[] = {1,3,4,2,7,8,9,10,14,16};
		heapSort(arr);
		for(int i =0;i<arr.length;i++)
			System.out.println(arr[i]);
	}
}


相关文章:

  • 让Docker容器使用静态独立的外部IP(便于集群组建)
  • 算法导论学习笔记——插入排序
  • 本地Git仓库与Github远程仓库同步
  • 算法导论学习笔记——合并排序
  • 算法导论学习笔记——最大优先级队列
  • Data.xml文件找不到的解决
  • 算法导论学习笔记——快速排序算法
  • instancetype
  • CentOS下SVN使用
  • java虚拟机学习笔记——java安全模型
  • 《C++ Primer Plus(第六版)》(9)(第七章 函数 笔记和答案)
  • 算法导论学习笔记——计数排序算法
  • 本地化资源文件关键字重复的报错解决。
  • 数字签名是什么?
  • 探索推荐引擎内部的秘密:推荐引擎初探
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Android优雅地处理按钮重复点击
  • FastReport在线报表设计器工作原理
  • java8-模拟hadoop
  • JavaScript 奇技淫巧
  • Mocha测试初探
  • Solarized Scheme
  • vue学习系列(二)vue-cli
  • Webpack 4x 之路 ( 四 )
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 面试遇到的一些题
  • 爬虫模拟登陆 SegmentFault
  • 前端相关框架总和
  • 什么是Javascript函数节流?
  • 数组的操作
  • kubernetes资源对象--ingress
  • 说说我为什么看好Spring Cloud Alibaba
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • $.ajax()参数及用法
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (2015)JS ES6 必知的十个 特性
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十五)使用Nexus创建Maven私服
  • (一一四)第九章编程练习
  • **CI中自动类加载的用法总结
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .Net mvc总结
  • .net 生成二级域名
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • /etc/fstab 只读无法修改的解决办法
  • /proc/vmstat 详解
  • @Responsebody与@RequestBody
  • [Angularjs]ng-select和ng-options
  • [AX]AX2012 R2 出差申请和支出报告
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]