java堆排序(大根堆)

实现堆排序的算法思路是先创建堆,也就是从叶子节点起对每一层的孩子节点及其对应位置的父亲节点进行比较,较大的孩子节点替换较小的父亲节点,一级一级比较替换,就创建出了大根堆,小根堆反之。创建好大根堆以后,我们,将整棵树的根节点与最后最后一个节点替换位置,然后去除最后一个节点,在创建一个新的大根堆,以此类推,完成排序。代码如下:

/**
* <p>堆排序
* @param int[] arr
* @return int[]
* */
public int[] heapSort(int[] arr){

arr=creatHeap(arr,arr.length-1);//初始化大根堆
//每次替换大根到对应最后位置,有后往前排序
for(int i=arr.length-1;i>0;i--){
int temp=arr[i];
arr[i]=arr[0];
arr[0]=temp;
creatHeap(arr,i-1);//对去除根的数组再次排序为大根堆
}
return arr;
}

/**

* <p>堆创建算法		 * @param int[] arr		 * @return int[]		 * */		public int[] creatHeap(int[] arr,int length){			System.out.println("建立大根堆:");			for(int i=length;i>0;i--){				int root=i;				int j=(root-1)/2;				/*叶子节点和上一层的根比较*/				while(root>0){					if(arr[root]>arr[j]){						int temp=arr[j];						arr[j]=arr[root];						arr[root]=temp;											}					/*改变位置,比较上一层与其父层节点*/					root=j;					j=(root-1)/2;									}			}			for(int i=0;i<arr.length;i++){				System.out.print("  arr["+i+"]="+arr[i]);			}				System.out.println("");			return arr;		}
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

B树与B+树的区别?

1.B树简介B树是一种多路平衡搜索树。它由二叉树变换而来的。定义如下:1.1每个节点最多有m1个关键字1.2根节点最少有1个关键字1.3非根节点至少有m/2个关键字1.4每个节点的关键字都是按照从小到大的顺序排列,每个关键字的左子树中的关键字都小于它,而右子树中所有关键字都大于它。1.5所有的叶子节点都处于同

GoJS API学习

varnode{};node"key""节点Key";node"loc""00";//节点坐标node"text""节点名称";//添加节点通过按钮点击,添加新的节点到画布myDiagram.model.addNodeData(nod

ADVtree

循环第一个根节点(Nodes0)下的子节点(Node)并添加子节点foreach(NodetninclTree1.advTree1.Nodes0.Nodes){NodennewNode();

PHP数据结构与算法:树

一、概念树(Tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n1)个有限节点组成一个具有层次关系的集合。看起来向一颗根朝上叶朝下的的倒挂树。每个节点有零个或多个子节点没有父节点的节点称为根节点每一个非根节点有且只有一个父节点除根

C语言递归之二叉树的最小深度

https://www.cnblogs.com/shichampion/p/12262678.html题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例输入:3,9,20,null,null,15,7