您的位置:首页 > 其它

堆排序 Heap Sort

2017-12-02 09:37 429 查看
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 那么广泛,但是二叉堆的数据结构有非常广泛的应用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  heap heapsort