Heap Sort
使用heap sort做升序
1) 根据输入的数据创建最大堆;
2)创建以后最大的元素会在根节点上,交换根节点与最后一个元素,将剩余的元素重新堆化;
3) 重复2) 直到所有元素堆化完成。
Code
public class HeapSort {
@Test
public void test(){
int[] arr = {4,10,3,5,1};
sort(arr);
}
public void sort(int arr[]) {
int n = arr.length;
// Build heap (rearrange array)
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(arr, n, i);
}
// One by one extract an element from heap
for (int i = n - 1; i >= 0; i--) {
// Move current root to end
int temp = arr[0];
arr[0] = arr[i];
arr[i] = temp;
// call max heapify on the reduced heap
heapify(arr, i, 0);
}
}
// To heapify a subtree rooted with node i which is
// an index in arr[]. n is size of heap
void heapify(int arr[], int n, int i) {
int largest = i; // Initialize largest as root
int l = 2 * i + 1; // left = 2*i + 1
int r = 2 * i + 2; // right = 2*i + 2
// If left child is larger than root
if (l < n && arr[l] > arr[largest]){
largest = l;
}
// If right child is larger than largest so far
if (r < n && arr[r] > arr[largest]){
largest = r;
}
// If largest is not root
if (largest != i) {
int swap = arr[i];
arr[i] = arr[largest];
arr[largest] = swap;
// Recursively heapify the affected sub-tree
heapify(arr, n, largest);
}
}
}
Note
- 堆排序不需要额外空间;
- 在实际应用中,堆排序不如Quicksort 和Mergesort 那么广泛,但是二叉堆的数据结构有非常广泛的应用。