堆排序

按照小根堆调整应该是:结果是从大到小的。

package com.wjy.renren;

import java.util.Arrays;

public class HeapSort {
	public static void main(String args[]){
		//int[] array={9, 8, 3, 6, 2,8,5};
		int[] array={0,6,9,3,8,2,8,5};
		
		heapSort(array);
		System.err.println(Arrays.toString(array));
	}
	/**
	 * 对于小根堆,每次调整之后顶层元素一定是这个树中最小的元素,
	 * 所以可以和最后一个叶子节点交换,将这个叶子节点交换上去而自己实际上已经不再树里了,
	 * 最后得到的数组从后向前遍历就是元素值从小到大的顺序。最小的在数组的最后一个,因为他是第一个被
	 * 置换到队尾的。次小的元素被换到队尾,并不是和那个最小的元素交换而是和无序的队列中的队尾交换,
	 * 这样一来就换到了倒数第二个。以此类推。每完成一次堆的调整,无序队列长度-1,有序长度从后到前
	 * 长度加1。
	 * @param array
	 */
	private static void heapSort(int[] array){
		int n=array.length;
		for(int i=n-1;i>1;i--){
			adjustHeap(array, i);
			array[i]^=array[1];
			array[1]^=array[i];
			array[i]^=array[1];
		}
	}

	private static void adjustHeap(int[] array,int end){
		int n=end,pos=0;//pos用来记录最小的那个。
		for(int j=n-1;j>=1;j--){
			if(2*j<=n){//至少有左孩子
				if((2*j+1)<=n){//有右孩子
					if(array[2*j]>array[2*j+1]){//左孩子大
						pos=2*j+1;
					}else{
						pos=2*j;
					}
			}else{//只有左孩子
				pos=2*j;
			}
				if(array[j]<array[pos]){//父节点最小
					continue;
				}else {
					array[j]^=array[pos];
					array[pos]^=array[j];
					array[j]^=array[pos];
				}
		}
		
	}
}
}

 

堆排序的思想,是首先按照二叉树建堆:



 

然后堆顶元素和最后一个元素互换,输出最后一个元素。重新调整堆。



 



 



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值