1. 程式人生 > >JAVA-基本排序-堆排序

JAVA-基本排序-堆排序

堆排序

定義

堆是一種特殊的樹形資料結構,其每個節點都有一個值,通常提到的堆都是指一顆完全二叉樹,根結點的值小於(或大於)兩個子節點的值,同時,根節點的兩個子樹也分別是一個堆。

實現思路

1、將待排序的序列構造成一個大頂堆。此時,整個序列的最大值就是堆頂的根節點。 2、將它與堆陣列的末尾元素交換,此時末尾元素就是最大值; 3、然後將剩餘的 n-1 個序列重新構造成一個堆,這樣就會得到 n 個元素中次大的值。 4、將它與堆陣列的次末尾元素交換,此時次末尾元素就是次最大值; 5、如此反覆執行,便能得到一個有序序列了。

程式碼實現

import java.util.Arrays;
public class HeapSort {
	/**
	 * 堆調整
	 * @param a 待排序的序列
	 * @param i 待調整的節點
	 * @param len 待調整序列長度
	 */
	public static void adjustHeap(int[] a, int i, int len) {
		//初始需要被調整的節點
		int temp=a[i];
		for (int j = 2 * i; j < len; j *= 2) {
			//找出孩子節點中值大的節點
			if (j < len && a[j] < a[j + 1])
				++j; 
			//如果孩子節點比根節點小則結束迴圈
			if (temp >= a[j])
				break;
			//否則將較大的節點放到被調整的節點上
			a[i] = a[j];
			//記錄需要被調整的節點
			i = j;
		}
		a[i] = temp;
	}

	/**
	 * 堆排序
	 * @param a
	 */
	public static void heapSort(int[] a) {
		int i;
		// 構建一個大頂堆
		for (i = a.length / 2 - 1; i >= 0; i--) {
			adjustHeap(a, i, a.length - 1);
		}
		// 將堆頂記錄和當前未經排序子序列的最後一個記錄交換
		for (i = a.length - 1; i >= 0; i--) {
			int temp = a[0];
			a[0] = a[i];
			a[i] = temp;
			// 將a中前i-1個記錄重新調整為大頂堆
			adjustHeap(a, 0, i - 1);
		}
	}
	public static void main(String[] args) {
		int a[] = { 49,38,65,97,76,13,27,50 };
		heapSort(a);
		System.out.println(Arrays.toString(a));
	}
}