您的位置:首页 > 其它

堆排序

2014-10-20 23:30 134 查看
思路

使用数组存储,父节点与左右孩子节点的映射关系为

k为父节点,则左孩子为2k+1,右孩子为2k+2;

k为孩子节点,其父节点为(k-1)/2.

(1)、从最后一个非叶子节点开始倒序建立初始堆。

(2)、输出堆顶元素,把最后一个叶子节点放到堆顶,重新调整为堆。

(3)、重复(2)直到堆中没有元素。

package Lesson1;

public class MyHeap {

// a为堆数据;n为有效数据个数;k为待筛选节点
static void heapAjust(int[] a, int n, int k) {// 对节点k进行筛选,往下落
int k1 = 2 * k + 1;// 左右孩子
int k2 = 2 * k + 2;

if (k1 >= n && k2 >= n) {// 叶子节点不需调整
return;
}

int a1 = Integer.MAX_VALUE;
int a2 = Integer.MAX_VALUE;

if (k1 < n) {
a1 = a[k1];
}
if (k2 < n) {
a2 = a[k2];
}

if (a[k] <= a1 && a[k] <= a2) {
return;
}

if (a1 < a2) {
int t = a[k];
a[k] = a[k1];
a[k1] = t;
heapAjust(a, n, k1);
} else {
int t = a[k];
a[k] = a[k2];
a[k2] = t;
heapAjust(a, n, k2);
}

}

static void heapSort(int[] a) {

// 建立初始堆,从最后一个非叶子节点往上调整
for (int i = (a.length - 1) / 2; i >= 0; i--) {
heapAjust(a, a.length, i);
}

int n = a.length;// 有效元素个数
while (n > 0) {// 输出
System.out.print(a[0] + " ");// 输出堆顶元素
a[0] = a[n - 1];// 把最后一个元素放到堆顶
n--;
heapAjust(a, n, 0);// 调整堆顶元素
}
System.out.println();
}

public static void main(String[] args) {

int[] a = { 12, 3, 6, 8, 5, 19, 20, 16, 4, 2, 7, 13, 9, 11 };

heapSort(a);// 堆排序
/*
* for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); }
* System.out.println();
*/
}
}


reference
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: