您的位置:首页 > 其它

堆排序

2014-09-11 23:44 113 查看
/**
* 堆排序
*
* @param a
*
*/
public static void heapSort(int[] a) {
for (int i = (a.length - 2) / 2; i >= 0; i--) { // 从最后一个非叶子节点开始初始化堆
adjustHeap(a, a.length, i);
}

int[] tmp = new int[a.length];
for (int i = 0; i < a.length; i++) { // 输出堆
tmp[i] = a[0];
swap(a, 0, a.length - 1 - i); // 最后一个节点交换到第一个节点
adjustHeap(a, a.length - i - 1, 0); // 调整堆,同时堆的大小减小了
}

System.arraycopy(tmp, 0, a, 0, a.length);
}

private static void adjustHeap(int[] a, int n, int k) { // 调整堆
int k1 = k * 2 + 1;
int k2 = k * 2 + 2;

if (k2 < n) {
if (a[k] > a[k2]) {
swap(a, k, k2);
adjustHeap(a, n, k2);
}
}
if (k1 < n) {
if (a[k] > a[k1]) {
swap(a, k, k1);
adjustHeap(a, n, k1);
}
} else {
return;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: