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; } } 第一次写,写的好乱,不知有没有错,帮忙指摘一下~~