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

【排序思想】:
大顶堆:堆的每个父节点都大于其孩子节点
小顶堆:堆的每个度节点都小于其孩子节点
堆排序的概要:首先对于一组数据,将这组数据填入到一个二叉树中,这是构成了初始堆
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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值