排序算法之堆排序

来源:互联网 发布:淘宝只退款不退货教程 编辑:程序博客网 时间:2024/06/18 15:24

之前分享过快速排序以及归并排序,现在和大家分享一篇堆排序

=======相关链接=====

想了解快速排序请点击雷霆崖传送门

想了解归并排序请点击铁炉堡传送门

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

还是按照惯例解释概念,阐明步骤,上代码

堆排序规则是什么,假定有以下数组 3,5,7,2,6,1,3,8,4 堆排序会将他们先组成一个堆模型,组装结果为


堆排序我们要的是大根堆,大根堆意思就是根节点比两个子节点都要大,所以我们要对这个堆进行整理

例如2这个节点,需要找到子节点最大的,然后替换掉2,因此会变为

此时要对5节点对应的子节点进行整理,所以5和最大的子节点也就是8换位置,最终将这个堆整理为大根堆,如图


这就是一个大根堆,大家看整理的是否和我一样,然后可以进行下一步骤,就是把根节点拿出来,作为数组的最后一位,然后把堆的最后一位,也就是4放到根节点的位置,形成一个新的堆,如图


然后依次类推最终把所有根节点都取出来,形成一个新的有序数组,我们看代码

public class HeapSort {/** * 堆排序 * @param array */public static void heapSort(int[] array){//组装堆for (int i = array.length / 2; i >= 0; i--) {heapAdjust(array, i, array.length - 1);}System.out.println("heap:");print(array);//倒序取for (int i = array.length - 1; i >0 ; i--) {//交换根和最后元素int temp = array[i];array[i] = array[0];array[0] = temp;//调整剩余元素为堆heapAdjust(array, 0, i);System.out.println("the " + (array.length - i) + " step:");print(array);}}/** * 组装堆 * @param array * @param parent 父节点所对下标 * @param length */public static void heapAdjust(int[] array,int parent,int length){int temp = array[parent];int child = 2 * parent + 1;//左子节点下标while(child < length){//找最大子节点if(child + 1 < length && array[child] < array[child + 1]){child = child + 1;}if(temp >= array[child]){break;}//小于则交换array[parent] = array[child];array[child] = temp;//继续parent = child;child = 2 * parent + 1;}}private static void print(int[] array){for (int i : array) {System.out.print(i + ",");}System.out.println();System.out.println();}public static void main(String[] args) {int[] array = new int[]{3,5,7,2,6,1,3,8,4};heapSort(array);print(array);}}
堆排序可能没有快速排序和归并排序那么容易理解,可能需要多看一下代码才能体会到每一步的作用,这里就不过多解释了,有问题的朋友请留言,第一时间回复

原创粉丝点击