`
zhuyufufu
  • 浏览: 138841 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论
阅读更多
堆排序:
  堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。

Java代码实现示例:
package com.zas.algorithm;

import java.util.Arrays;

/**
 * 堆排序
 * @author zas
 */
public class HeapSort {

	public static void sort(int[] data) {
		// 大顶堆
		MaxHeap maxHeap = new MaxHeap();
		maxHeap.init(data);
		for (int i = 0; i < data.length; i++) {
			maxHeap.remove();
		}
		System.arraycopy(maxHeap.queue, 1, data, 0, data.length);
	}

	/**
	 * 大顶堆
	 * @author zas
	 */
	private static class MaxHeap {
		void init(int[] data) {
			this.queue = new int[data.length + 1];
			for (int i = 0; i < data.length; i++) {
				queue[++size] = data[i];
				fixUp(size);
			}
		}

		private int size = 0;
		private int[] queue;

		@SuppressWarnings("unused")
		public int get() {
			return queue[1];
		}

		public void remove() {
			swap(queue, 1, size--);
			fixDown(1);
		}

		// fixdown
		private void fixDown(int k) {
			int j;
			while ((j = k << 1) <= size) {
				if (j < size && queue[j] < queue[j + 1]) {
					j++;
				}
				if (queue[k] > queue[j]) {
					// 不用交换
					break;
				}
				swap(queue, j, k);
				k = j;
			}
		}

		private void fixUp(int k) {
			while (k > 1) {
				int j = k >> 1;
				if (queue[j] > queue[k]) {
					break;
				}
				swap(queue, j, k);
				k = j;
			}
		}
	}

	public static void swap(int[] data, int i, int j) {
		int temp = data[i];
		data[i] = data[j];
		data[j] = temp;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] a = { 5, 3, 6, 4, 1, 7, 3, 1, 9, 2, 8, 5, 3, 6, 4, 1, 7, 3, 1, 9, 2, 8, 5, 3, 6, 4, 1, 7, 3, 1, 9, 2, 8 };
		HeapSort.sort(a);
		System.out.println(Arrays.toString(a));
	}
}



堆排序的关键在于:拿掉最大最小根节点值后从新建立大顶堆或小顶堆。
分享到:
评论
Global site tag (gtag.js) - Google Analytics