关于堆排序的整理

xiaoxiao2021-02-28  74

每生成一次大(小)顶堆, 将数组首位(顶)与最后一位交换, 使数组减小一位,继续生成大(小)顶堆, 这样就依次将剩余数列中的最大最小元素取出,生成有序列表。 /*  *代码实现  * */ 1.想要实现堆排序,首先要保证是完全二叉树      只要让任何一个节点 i 的左节点= 2*i+1                                          右节点=2*i+2      保证不越界。 2.写一个递归方法      保证从最右下角的第一个非叶子节点k,在这个三点的小二叉树子树中的根节点是最大的      然后 k-- 递归调用本方法           注意:这里判断是否是最后一个节点的条件应为< size      得到最大顶堆 3.将最大顶堆的根节点与最后一个节点调换,然后 size减一,再调用递归方法。

4.重复2,3步骤得到有序数列。

java代码

package heap; import java.util.LinkedList; import java.util.List; /** * 堆排序的实现 * 撸的吐血 * @author Administrator * */ public class HeapifySort { public static void main(String[] args) { // 先初始化数组,并得到数组元素的个数。 int[] a={5,6,9,3,2,4,1,7,8}; int size=a.length; System.out.println(size); //生成完全二叉树 List<TreeNode> by=binary(a,size); /* for (int i=0;i<size;i++){ System.out.println(by.get(i).val); }*/ //递归生成最大顶堆的方法了 heapifySort(by,size); for (int i=0;i<size;i++){ System.out.println(by.get(i).val); } } //递归生成最大顶堆的方法了 private static void heapifySort(List<TreeNode> by,int size) { // TODO Auto-generated method stub for(int i=size-1;i>=0;i--){ if(by.get(i).left!=0){ int largest=by.get(i).val; //System.out.println(by.get(i).val); //存在右子叶的话 if(by.get(i).right<size){ //右子叶的值小于左子叶的值 if(by.get(by.get(i).right).val<by.get(by.get(i).left).val){ if(largest<by.get(by.get(i).left).val){ largest=by.get(by.get(i).left).val; by.get(by.get(i).left).val=by.get(i).val; by.get(i).val=largest;} }else{ //右子叶的值不小于左子叶的值 if(largest<by.get(by.get(i).right).val){ largest=by.get(by.get(i).right).val; by.get(by.get(i).right).val=by.get(i).val; by.get(i).val=largest; } } // if(largest<by.get(by.get(i).right).val){ // } }else if(by.get(i).left<size){ //不存在右子叶的话 if(largest<by.get(by.get(i).left).val){ largest=by.get(by.get(i).left).val; by.get(by.get(i).left).val=by.get(i).val; by.get(i).val=largest; } } } System.out.print("P"+by.get(0).val); } //下面要去置换出最大顶 if(size>0){ change(by,size-1); size--; heapifySort(by,size); } } public static List<TreeNode> change(List<TreeNode> by,int size){ int temp=by.get(0).val; by.get(0).val=by.get(size).val; by.get(size).val=temp; return by; } //生成完全二叉树 public static List<TreeNode> binary(int a[],int size){ /* * List是一个接口, * 如user_pyw所讲,不能直接new List,而应该使用ArrayList或者LinkedList(这些实现了List接口) */ List<TreeNode> by = new LinkedList<TreeNode>(); for(int i=0;i<size;i++){ TreeNode tn=new TreeNode(a[i]); if(2*i+1<size) tn.left=2*i+1; if(2*i+2<size) tn.right=2*i+2; by.add(tn); } return by; } } class TreeNode{ int val; //节点的数值 int left; //左节点的数组中的下标 int right; //右节点的数组中的下标 public TreeNode(int x){ val=x; } } 第一次写,写的好乱,不知有没有错,帮忙指摘一下~~

转载请注明原文地址: https://www.6miu.com/read-65406.html

最新回复(0)