您的位置:首页 > 其它

[算法入门]排序算法之堆排序

2014-05-08 09:02 218 查看
平时我们在开发过程中,对Collection对象排序很简单,Collections对象已经给我们实现了排序方法sort(),我们直接调用就可以了,如果我们使用的数据结构是数组怎么办呢?

这时,堆排序算法就派上用场了。

要了解这个算法,就要先了解完全二叉树的概念和特性。

在起始数组为 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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆排序