关于堆排序的整理

来源:互联网 发布:node.js爬虫 编辑:程序博客网 时间:2024/06/04 17:59
每生成一次大(小)顶堆,
将数组首位(顶)与最后一位交换,
使数组减小一位,继续生成大(小)顶堆,
这样就依次将剩余数列中的最大最小元素取出,生成有序列表。

/*
 *代码实现
 *
*/
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 stubfor(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 l = new LinkedList();。你的l直接就是等于null,在调用l.add()不就是一个空指针吗? */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;}}
第一次写,写的好乱,不知有没有错,帮忙指摘一下~~