什么是堆排序,具体百度。
推荐一个讲得比较清楚的视频教程:什么是堆排序?
下面贴代码:
// 名称:堆排序——对数组里的十个整数,按从小到大的顺序排序输出
// 学校:河北大学
// 作者:来智慧<3552743712@qq.com>
// 时间:2016年10月11日
public class H1010{
public static void main(String[] args){
int[] array = new int[]{14, 28, 40, 92, 95, 20, 13, 44, 70, 14};
printArray(array);
heapSorting(array);
printArray(array);
}
// 打印数组
public static void printArray(int[] array){
for(int i = 0; i < array.length; i++){
System.out.print(array[i] + " ");
}
System.out.println();
}
// 交换数组元素
public static void exchangeElement(int[] array, int index1, int index2){
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
// 进行堆排序
public static void heapSorting(int[] array){
// 首先创建一个最大堆
createMaxHeap(array);
// 接下来把根节点位置的数值调到数组的末尾
// 然后调整数组的长度减一(最大值已经放到最后了,所以不需要对它进行调整了)
// 调用找最大节点的函数,进行剩余数组最大堆的创建工作
for(int i = array.length - 1; i >= 1; i--){
exchangeElement(array, 0, i);
findMaxNode(array, i, 0);
}
}
// 创建一个最大堆
public static void createMaxHeap(int[] array){
// 定义指针位置为(数组长度-1)/2
// 然后调用寻找最大节点函数,比较指针所指数值与左右两节点大小关系
// 从叶节点开始,逐渐递减,依次向上进行比较
int index = (array.length - 1) / 2;
for(int i = index; i >= 0; i--){
findMaxNode(array, array.length, i);
}
}
// 找出最大节点,并进行递归调用
// 找出父节点、左子节点、右子节点三者中最大者,然后将最大者与父节点交换位置
// 进行递归调用,以防上层更改,影响下层
public static void findMaxNode(int[] array, int arrayLength, int index){
int left = 2 * index + 1;
int right = 2 * index + 2;
int largest = index;
// 如果左节点未越界且比父节点数值要大,则把最大值指针指向它
if(left < arrayLength && array[left] > array[index]){
largest = left;
}
// 如果右节点未越界且比此时的最大值要大,则把最大值指针指向它
if(right < arrayLength && array[right] > array[largest]){
largest = right;
}
// 如果最大值所在位置并不在父节点,则交换父节点与最大值所在位置
// 然后进行递归调用,将父节点调整为原来最大子节点所在位置
// 这么做的主要目的是为了防止调整位置之后,叶节点下方出现比它大的值
if(index != largest){
exchangeElement(array, index, largest);
findMaxNode(array, arrayLength, largest);
}
}
}
看视频大概可以能明白我程序是怎么一回事,程序在eclipse测试过,没有问题~
如果有看不懂的,可以加我QQ,互相交流~
也可以在下方留言,谢谢支持~