您的位置:首页 > 编程语言 > Java开发

Java-堆排序

2017-08-27 16:03 113 查看
public class Main {

public static void main(String[] args) {
int a[] = {8, 2, 5, 6, 4, 8, 9, 7, 14, 2, 3, 6, 4};
a = heapSort(a);
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}

//构建大根堆
private static int[] buildMaxHeap(int[] a) {
//从最后一个节点a.length-1的父节点(array.length-1-1)/2开始,直到根节点0,反复调整堆
int half = (a.length - 2) / 2;
for (int i = half; i >= 0; i--) {
adjustDownToUp(a, i, a.length);
}
return a;
}

//将元素array[k]自下往上逐步调整树形结构
private static void adjustDownToUp(int[] a, int k, int length) {
int temp = a[k];
for (int i = 2 * k + 1; i < length - 1; i = 2 * i + 1) {    //i为初始化为节点k的左孩子,沿节点较大的子节点向下调整
if (i < length && a[i] < a[i + 1]) {  //取节点较大的子节点的下标
i++;   //如果节点的右孩子>左孩子,则取右孩子节点的下标
}
if (temp >= a[i]) {  //根节点 >=左右子女中关键字较大者,调整结束
break;
} else {   //根节点 <左右子女中关键字较大者
a[k] = a[i];  //将左右子结点中较大值array[i]调整到双亲节点上
k = i; //修改k值,以便继续向下调整
}
}
a[k] = temp;  //被调整的结点的值放入最终位置
}
//堆排序
public static int[] heapSort(int[] array) {
array = buildMaxHeap(array); //初始建堆,array[0]为第一趟值最大的元素
for (int i = array.length - 1; i > 1; i--) {
swap(array, 0, i);//将堆顶元素和堆低元素交换,即得到当前最大元素正确的排序位置
adjustDownToUp(array, 0, i);  //整理,将剩余的元素整理成堆
}
return array;
}

//交换
public static void swap(int a[], int i, int j) {
a[i] = a[i] + a[j];
a[j] = a[i] - a[j];
a[i] = a[i] - a[j];
}
}


直接上代码,从代码中细细品味,分析。

思路:1、构建大堆或小堆 2、交换、调整
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: