数据结构之排序(五)堆排序

<span style="font-size:18px;">package com.xaut.zyq;

import java.util.Arrays;

//堆排序就是简单选择排序的一种改进,这种改进的效果是非常明显的。
/*
 * 堆是具有下列性质的完全二叉树,每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;
 * 或者 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
 * 堆排序的基本思想就是将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点。
 * 将它移走(其实就是将其与将其与堆数组的末尾元素交换,此时末尾元素)
 */
public class HeapSort {
	public static void main(String[] args) {
		int a[]={0,50,10,90,30,70,40,80,60,20};
		HeapSort hs=new HeapSort();
		System.out.println(Arrays.toString(hs.HeapSort(a)));
	}
	private int[] HeapSort(int b[]){
		int i;
		for ( i = b.length/2; i>0; i--) {//将数组b构建成一个大顶堆
			HeapAdjust(b,i,b.length-1);
		}
		for ( i = b.length-1; i>1; i--) {
			swap(b,1,i);//将顶堆记录和当前未经排序子序列的最后一个记录交换
			HeapAdjust(b, 1, i-1);//将剩下的重新进行调整为大顶堆
		}
		return b;
	}
	//函数被第一次调用时,s=b.length/2; m=b.length;
	private void HeapAdjust(int c[],int s,int m){
		int temp,j;
		temp=c[s];
		for(j=2*s;j<=m;j*=2){
			if(j<m && c[j]<c[j+1])
				++j;
			if(temp>=c[j])
				break;
			c[s]=c[j];
			s=j;
		}
		c[s]=temp;
	}
	private void swap(int c[], int m, int n) {
		int temp = c[m];
		c[m] = c[n];
		c[n] = temp;
	}
}
/*
 * 性质5:第一条就说一颗完全二叉树,如果i=1,则结点i是二叉树的根,无双亲;
 * 如果i>1,则其双亲是结点[i/2]。
 * 那么对于有n个结点的二叉树而言,它的i值自然就是小于等于[n/2]了。
 * 步骤:
 * 先建立大顶堆,然后再交换调整
 * 再次递归建立新的大顶堆,将最大堆的根节点和最小的位置交换,这样就排序是先选出最大的,接着依次进行。
 */</span>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值