堆排序

<span style="font-size:18px;">/**
 * 堆排序,基于优先队列的下沉操作
 * @author xxxu
 *
 */
public class HeapSort {
	/*
	 * 数组a[0]不参加排序,k和数组索引一一对应了
	 */
	public void sort(int[] a){
		int N=a.length-1;
		/*
		 * k=N/2; 2k 和 2k+1 就能顾及到所有的元素
		 * 在下沉过程中,小的下沉,大的就上浮
		 * 所以到k=1时,下沉后,根节点就是最大的
		 */
		for (int k = N/2; k >=1; k--) {
			sink(a, k, N);
		}
		/*
		 * 根节点最大的,和尾结点交换后,此时尾结点就是最大的,N--,尾结点就不需要动了,以此类推
		 */
		while(N>1){
			exch(a, 1, N--);
			sink(a, 1, N);
		}
	}
	
	// 下沉
	private void sink(int[] pq, int k, int N) {
		while (2 * k <= N) {
			int j = 2 * k;
			// 比较左右结点的大小,决定父节点和左结点交换还是有节点交换
			if (j < N && less(pq,j, j + 1)) {
				j++;
			}
			if (!less(pq,k, j)) {
				break;
			}
			exch(pq,k, j);
			k = j;
		}
	}

	private boolean less(int[] pq,int i, int j) {
		if (pq[i] < pq[j]) {
			return true;
		} else {
			return false;
		}
	}

	private void exch(int[] pq,int i, int j) {
		int t = pq[i];
		pq[i] = pq[j];
		pq[j] = t;
	}
	
	public void show(int[] a){
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
}</span>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值