标签:选择 排序 return 判断 heapsort oid ++ problem lintcode
堆排序可归纳为两个操作:
1)建堆:根据初始数组去构造初始堆(构建一个完全二叉树,保证所有的父结点都比它的孩子结点数值大)。
2)调整堆:每次交换第一个和最后一个元素,输出最后一个元素(最大值),然后把剩下元素重新调整为大根堆。 当输出完最后一个元素后,这个数组已经是按照从小到大的顺序排列了。调整堆的过程是:比较节点i和左右节点,选出三者最大的,如果是孩子节点,那么交换;并继续比较。
建大根堆:buildMaxHeap(a[])
从A.length / 2一直到根结点进行堆调整。
堆调整:adjustHeap(a[], parent, length);
堆排序:heapSort(a[])
辅助交换:swap(a[], i, j)
参考代码:
public class Solution { /** * @param A an integer array * @return void */ //堆排序 public void sortIntegers(int[] a) { if (a.length == 0) return; buildMaxHeap(a); for (int i = a.length - 1; i > 0; i--) { swap(a, i, 0); adjustHeap(a, 0, i); } } public void buildMaxHeap(int[] a) { for (int i = a.length/2; i >= 0; i--) { adjustHeap(a, i, a.length); } } public void adjustHeap(int[] a, int parent, int length) { int tar = a[parent]; int child = parent * 2 + 1; while (child < length) { if (child + 1 < length && a[child] < a[child + 1]) child++; if (a[child] < tar) break; a[parent] = a[child]; parent = child; child = child * 2 + 1; } a[parent] = tar; } public void swap (int[] a, int i, int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } }
参考:堆排序
标签:选择 排序 return 判断 heapsort oid ++ problem lintcode
原文地址:http://www.cnblogs.com/buwenyuwu/p/7219576.html