堆排序_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 堆排序

堆排序

 2013/12/8 0:26:05  zhuyufufu  程序员俱乐部  我要评论(0)
  • 摘要:堆排序:堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。Java代码实现示例:packagecom.zas.algorithm;importjava.util.Arrays;/***堆排序*@authorzas*/publicclassHeapSort{publicstaticvoidsort(int[]data){//大顶堆MaxHeapmaxHeap=newMaxHeap();maxHeap.init(data)
  • 标签:堆排序
堆排序
  堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。

Java代码实现示例:
class="java" name="code">
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));
	}
}



堆排序的关键在于:拿掉最大最小根节点值后从新建立大顶堆或小顶堆。
发表评论
用户名: 匿名