[算法入门]排序算法之堆排序
2014-05-08 09:02
218 查看
平时我们在开发过程中,对Collection对象排序很简单,Collections对象已经给我们实现了排序方法sort(),我们直接调用就可以了,如果我们使用的数据结构是数组怎么办呢?
这时,堆排序算法就派上用场了。
要了解这个算法,就要先了解完全二叉树的概念和特性。
在起始数组为 0 的情形中:
父节点i的左子节点在位置 (2*i+1);
父节点i的右子节点在位置 (2*i+2);
子节点i的父节点在位置 floor((i-1)/2);
算法分两步:
通过递归调用,从下到上把每一个子节点都构建成最大堆
重新对数组从小到大排序
创建最大堆:
重新排序
这时,堆排序算法就派上用场了。
要了解这个算法,就要先了解完全二叉树的概念和特性。
在起始数组为 0 的情形中:
父节点i的左子节点在位置 (2*i+1);
父节点i的右子节点在位置 (2*i+2);
子节点i的父节点在位置 floor((i-1)/2);
算法分两步:
通过递归调用,从下到上把每一个子节点都构建成最大堆
重新对数组从小到大排序
创建最大堆:
private static void maxHeapify(int[] data, int heapSize, int index) { int left = getChildLeftIndex(index); int right = getChildRightIndex(index); int largest = index; if (left < heapSize && data[index] < data[left]) { largest = left; } if (right < heapSize && data[largest] < data[right]) { largest = right; } if (largest != index) { int temp = data[index]; data[index] = data[largest]; data[largest] = temp; maxHeapify(data, heapSize, largest); } }
重新排序
private static void heapSort(int[] data) { for (int i = data.length - 1; i > 0; i--) { int temp = data[0]; data[0] = data[i]; data[i] = temp; maxHeapify(data, i, 0); } }