堆排序

来源:互联网 发布:万影数据 编辑:程序博客网 时间:2024/06/06 00:33
<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>

0 0
原创粉丝点击