您的位置:首页 > 理论基础 > 数据结构算法

Java数据结构——堆排序实现

2016-05-05 14:22 465 查看
package 排序;

public class 堆排序 {
public static void main(String[] args) {
int[] array = {3,1,5,7,2,4,9,6,10,8};
System.out.println("数组初始值:");
print(array,10);
heapSort(array,10);
System.out.println("数组转化后的结果:");
print(array, 10);
}

/**
* 堆排序算法
* @param array
* @param i
*/
private static void heapSort(int[] array, int i) {
//修建初始堆
buildingHeap(array,10);
//从最后一个元素开始对序列进行调整
for (int j = i-1;j>0;--j) {
//交换堆顶元素array[0]和堆中最后一个元素
int temp = array[j];
array[j] = array[0];
array[0] = temp;
//每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整
heapAdjust(array, 0, j);
}
}

/**
* 讲array数组建成堆
* 调整完之后的第一个元素是序列最小的元素
* @param array
* @param i
*/
private static void buildingHeap(int[] array, int i) {
System.out.println("修建初始堆:");
for (int j = (i-1)/2; j >= 0; --j) {
heapAdjust(array,j,i);
}
System.out.println("结束修建!!!!!!!!!");
}

/**
* 修建新的堆
* @param array	待调整的堆数组
* @param j		待调整的数组元素的位置
* @param i		i是数组的长度
*/
private static void heapAdjust(int[] array, int j, int length) {
int temp = array[j];
int child = 2*j + 1;//左孩子结点的位置。(i+1 为当前调整结点的右孩子结点的位置)

while (child<length) {
// 如果右孩子存在并且右孩子大于左孩子(找到比当前待调整结点大的孩子结点)
if (child+1 < length && array[child]<array[child+1]) {
++child;
}
if (array[j]<array[child]) { // 如果较大的子结点大于父结点
array[j] = array[child]; // 那么把较大的子结点往上移动,替换它的父结点
j = child;				 // 重新设置s ,即待调整的下一个结点的位置
child = 2*j +1;
} else {					 // 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出
break;
}
array[j] = temp;
}
System.out.println("调整:");
print(array, length);
}

private static void print(int[] array, int i) {
for (int j = 0; j < i; j++) {
System.out.print(" " + array[j]);

}
System.out.println();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息