24.java数据结构与算法-堆排序(笔记)

news/2024/5/19 3:38:50 标签: 算法, 数据结构, java, 堆排序, 排序算法

一、堆排序介绍

在这里插入图片描述
在这里插入图片描述

二、堆排序的基本思想

在这里插入图片描述
其实在整个过程中根本就没有创建树,而是对一个数组进行操作

图解:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
交换过后就相当于9离开了大顶堆数组

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码演示:

java">package tree;

import java.util.Arrays;

public class HeapSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 要求将数组升序排列
		int arr[] = { 4, 6, 8, 5, 9 };
		heapSort(arr);
	}

	// 编写一个堆排序的方法
	public static void heapSort(int arr[]) {
		int temp = 0;
		System.out.println("堆排序!");
		// 分布完成
//		addjustHeap(arr,1,arr.length);
//		System.out.println("第一次"+Arrays.toString(arr));//4,9,8,5,6
//		
//		addjustHeap(arr,0,arr.length);
//		System.out.println("第二次"+Arrays.toString(arr));//9,6,8,5,4

		// 完成我们最终代码
		// 将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆
		for (int i = arr.length / 2 - 1; i >= 0; i--) {
			adjustHeap(arr, i, arr.length);
		}
		/*
		 * 2)将堆顶元素与末尾元素交换,将最大元素“沉”到数组末端
		 * 3)重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序
		 */
		for (int j = arr.length - 1; j > 0; j--) {
			// 交换
			temp = arr[j];
			arr[j]=arr[0];
			arr[0]=temp;
			adjustHeap(arr,0,j);
		}
		System.out.println("数组=" + Arrays.toString(arr));
	}
	// 将一个数组(二叉树)调整成一个大顶堆

	/**
	 * 功能:将以i对应的非叶子节点的树调整成大顶堆
	 * 
	 * @param arr    待调整的数组
	 * @param i      表示非叶子节点在数组中的索引
	 * @param length 表示对多少个元素进行调整
	 */

	public static void adjustHeap(int arr[], int i, int length) {
		int temp = arr[i];// 先取出当前元素的值,保存在临时变量
		// 开始调整
		// 说明
		// 1.k=i*2+1 k是i节点的左子节点
		for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
			if (k + 1 < length && arr[k] < arr[k + 1]) {// 说明左子节点值小于右子节点的值
				k++;// k指向右子节点
			}
			if (arr[k] > temp) {// 如果左子节点的值大于父节点
				arr[i] = arr[k];// 吧较大的值赋给当前节点
				i = k;// !!! i指向k,继续循环比较
			} else {
				break;// !
			}
		}
		// 当for 循环结束后,我们已经将以i为父节点的树的最大值,放在了最顶
		arr[i] = temp; // 将temp值放到调整后的位置
	}

}


http://www.niftyadmin.cn/n/1177620.html

相关文章

【荐】PHP采集工具curl快速入门教程

为什么要用CURL&#xff1f; CURL&#xff08;Client URL Library Functions&#xff09;是一个利用URL语法在命令行方式下工作的文件传输工具。它支持很多协议&#xff1a;FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。CURL同样支持HTTPS认证&#xff0c;…

http 2.0

http://http2.github.io/http://tools.ietf.org/html/draft-mbelshe-httpbis-spdy-00http://en.wikipedia.org/wiki/HTTP_2.0转载于:https://www.cnblogs.com/dmdj/p/3539514.html

25.java数据结构与算法-赫夫曼树(笔记)

一、赫夫曼树基本介绍 二、赫夫曼树的几个重要概念和举例说明 三、赫夫曼树创建图解 看做一颗最简单的树&#xff1a;一个节点左右子树都为空&#xff0c;可以看做一个最简单的二叉树 步骤图解&#xff1a; 因为7和8比10小&#xff0c;13和19比10大&#xff0c;所以7,8在10的左…

The required Server component failed to start so Tomcat is unable to start解决之一

http://www.cnblogs.com/quxuedan/archive/2012/12/11/2813445.html 看看这个博客园园主说的吧转载于:https://www.cnblogs.com/ljy-1471914707/p/5866096.html

pathinfo()、dirname()、basename()获得文件的路径,名称等信息说明

在PHP中&#xff0c;若想通过函数获得一个文件的路径、名称&#xff0c;或者是扩展名等&#xff0c;是非常容易的一件事。可以使用dirname()、basename()、pathinfo()等多种途径获得相应的信息。 假设现在有一个图片文件&#xff0c;它的服务器端路径为&#xff1a;$path &quo…

vc++数据类型

vc数据类型分基本数据类型和扩展(特有)数据类型&#xff0c;现整理下&#xff0c;为了记忆&#xff0c;也为了开发过程中进行查阅&#xff0c;必竟人脑不是电脑&#xff0c;会有遗忘的过程。一、基本数据类型主类型分类型修饰符占用空间表示范围 Integer intshort2 bytes…

用expressjs写RESTful API

http://blog.csdn.net/kiwi_coder/article/details/36424671 用expressjs写RESTful API http://blog.csdn.net/jthink_/article/details/9708087 nodejsExpress实现Restful的web应用 http://www.tuicool.com/articles/Qviu2am Node.j…

27.java数据结构与算法-二叉排序树(BST)笔记

一、二叉排序树介绍 二叉排序树创建遍历代码演示&#xff1a; package binarysorttree;public class BinarySortTree {public static void main(String[] args) {int[] arr {7,3,10,12,5,1,9};BinarySortTree1 biarySrotTree1 new BinarySortTree1();//循环的添加节点到二叉排…