Java堆排序

1、小顶堆排序(降序堆排序)

import java.util.Arrays;
import java.util.Scanner;
 
public class Account{
	public static void adjustMinHeap(int[]a,int pos,int len){//调整一个最小堆
		int temp;//保存当前节点
		int child;//保存子节点
		for(temp=a[pos];2*pos+1<=len;pos=child){//pos依次等于儿子
			child=2*pos+1;//儿子等于当前节点的2倍加1
			if(child<len&&a[child]>a[child+1]){//child<len很关键或者写成child!=len同样可以。保证有右儿子,才可以比较
				child++;//保证child保存的是大的儿子
			}
			if(a[child]<temp){//大的儿子与父亲比较
				a[pos]=a[child];//当前pos位置放小的
			}else{//表示不需要移动,直接break
				break;
			}
		}
		a[pos]=temp;//当前的节点放之前保存的a[pos]值
	}
	public static void minHeapSort(int[] a){
		int i;
		int len=a.length;
		for(i=len/2-1;i>=0;i--){
			adjustMinHeap(a,i,len-1);//从len/2-1到len-1调整为最小堆
		}
		for(i=len-1;i>=0;i--){
			int temp=a[0];//不停的将堆顶的最小元素移到队尾!!!!最小值在最后,所以说小顶堆排序是降序的
			a[0]=a[i];
			a[i]=temp;
			adjustMinHeap(a,0,i-1);//再调整调整后的堆为最小堆
		}
	}
	public static void main(String [] args){
		int [] a={2,1,3,5,6,4,8,7,9};
		minHeapSort(a);
		System.out.println(Arrays.toString(a));
	}
	
}
输出:

[9, 8, 7, 6, 5, 4, 3, 2, 1]
2、大顶堆排序(升序堆排序)就是将上面的算法中关键词取反义,大于小于号取反

import java.util.Arrays;
import java.util.Scanner;
 
public class Account{
	public static void adjustMaxHeap(int[]a,int pos,int len){//调整一个大顶堆
		int temp;//保存当前节点
		int child;//保存子节点
		for(temp=a[pos];2*pos+1<=len;pos=child){//pos依次等于儿子
			child=2*pos+1;//儿子等于当前节点的2倍加1
			if(child<len&&a[child]<a[child+1]){//child<len很关键或者写成child!=len同样可以。保证有右儿子,才可以比较
				child++;//保证child保存的是小的儿子
			}
			if(a[child]>temp){//大的儿子与父亲比较
				a[pos]=a[child];//当前pos位置放da的
			}else{//表示不需要移动,直接break
				break;
			}
		}
		a[pos]=temp;//当前的节点放之前保存的a[pos]值
	}
	public static void minHeapSort(int[] a){
		int i;
		int len=a.length;
		for(i=len/2-1;i>=0;i--){//i>=0,i=len/2-1不是很懂!!!!!!!!!!!!!!
			adjustMaxHeap(a,i,len-1);//从len/2-1到len-1调整为最小堆!!!!!!!
		}
		for(i=len-1;i>0;i--){
			int temp=a[0];//不停的将堆顶的最大元素移到队尾!!!!最大值在最后,所以说大顶堆排序是升序的
			a[0]=a[i];
			a[i]=temp;
			adjustMaxHeap(a,0,i-1);//再调整调整后的堆为最大堆
		}
	}
	public static void main(String [] args){
		int [] a={2,1,3,5,6,4,8,7,9};
		minHeapSort(a);
		System.out.println(Arrays.toString(a));
	}	
}
输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9]






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值