关于堆排序的整理

每生成一次大(小)顶堆,
将数组首位(顶)与最后一位交换,
使数组减小一位,继续生成大(小)顶堆,
这样就依次将剩余数列中的最大最小元素取出,生成有序列表。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值