编程语言
首页 > 编程语言> > 排序算法之堆排序【小二讲堂】

排序算法之堆排序【小二讲堂】

作者:互联网

【排序思想】:
大顶堆:堆的每个父节点都大于其孩子节点
小顶堆:堆的每个度节点都小于其孩子节点
堆排序的概要:首先对于一组数据,将这组数据填入到一个二叉树中,这是构成了初始堆
A. 将初始堆进行排序,排序成一个大顶堆(或小顶对),将子节点与其父节点进行比较数据大的放在父节点的位置,直到生成一个大顶堆.
B. 进行排序输出,规则,将跟节点上的数据进行与子节点中最小的数进行比较,将较小的数据交换至根节点,将最大的数进行输出,
C. 将最大的数进行输出后,进行筛选调整,根据A中排大顶堆的方法,进行排序,将根节点上的数据放到被输出数的孩子树枝上,然后进行交换输出,
。。。由上几步可以得出排序结果
堆排序图示:
构建初始堆:
在这里插入图片描述
开始排序:
在这里插入图片描述
【代码演示】

	public static void sort(int[] array) {

	    init(array);

	    // 这个过程就是不断的从堆顶移除,调整

	    for (int i = 1; i < array.length; i++) {

	       int temp = array[0];

	       int end = array.length - i;

	       array[0] = array[end];

	       array[end] = temp;

	       adjust(array, 0, end);

	    }
	}

	//初始化堆,对对进行排序
	private static void init(int[] array) {

	    for (int i = array.length / 2 - 1; i >= 0; i--) {

	       adjust(array, i, array.length);

	    }

	}
	//进行判断比较排序
	private static void adjust(int[] array, int n, int size) {

	    int temp = array[n]; // 先拿出数据

	    int child = n * 2 + 1; // 这个是左孩子

	    while (child < size) { // 这个保证还有左孩子

	       // 如果右孩子也存在的话,并且右孩子的值比左孩子的大

	       if (child + 1 < size && array[child + 1] > array[child]) {
	           child++;
	       }

	       if (array[child] > temp) {

	           array[n] = array[child];

	           n = child; // n需要重新计算

	           child = n * 2 + 1; // 重新计算左孩子

	       } else {

	           // 这种情况说明左右孩子的值都比父结点的值小

	           break;

	       }
	    }
	    array[n] = temp;
	}

小二讲堂:https://me.csdn.net/Mirror_w
排序算法大全:https://blog.csdn.net/mirror_w/article/category/8856271

标签:temp,int,堆排序,讲堂,child,array,排序,节点
来源: https://blog.csdn.net/Mirror_w/article/details/89789477