荷兰国旗问题和堆排序

将指定数组段分为< = > 三块
思路 例如数组 | 3,2,4,5,7,6|
指定 L=3-6=R
先开辟一个小于等于区:
int less=L-1;
R=6;
3比较6 ++less 将3于++less=L=3,如果L位置的值小于R位置的值,将小于等于区less的值加一扩大开辟,和3交换,(less区域增加和小于R的值交换),3与3交换不动,一直到7,less不动,继续下一位6,与6比较 小于等于,注意,less+1此时下标是7的位置,7与6交换,整体变为3,2,4,5,6,7 区分左右区的下标less=4 值为6。

变种:
3,0,4,6,5,4
思路 : < less+1和当前位置交换,
=时,直接跳过,less不自增,
大于》时,当前位置和R(即最后一个)位置之前一个数互换,大于区增加。
过程:3|0 4 6 5 |4-------3 0|4 6 5 |4----等于跳过---------3 0 |4 6 5 |4-----大于R位置的值,即和R位置左边的值互换,大于区区域加1----3 0|4 5 |6 4 --比较5还大继续和它互换不动----3 0|4 |5 6 4 -------------当来到大于区边界时,R位置的值和大于区第一个数交换----3 0 |4 |4 6 5这样小于等于大于区即分块
在这里插入图片描述
堆排序:
排序为大根堆(不一定有序确定了最大值):二叉树所有的子节点的最大值都是父节点的头节点 任何一个数通过下标变换找到父节点,i-/2 ,通过和父节点比较知道父节点比自己小
例如 5 6 0 7 8 从5开始 6的父节点时i-1/2 即 1-1 /2 =0 和0位置
0 1 2 3 4
数值5比较,6比5大 交换位置,6 5 0 7 8 再看6的父节点没有比它大的 6调整完毕, 0的父节点2-1/2=0
0 比5小 不换 ,7的父节点3-1/2=1 7比5大交换 6 7 0 5 8 7的父节点6,交换 7 6 0 5 8 --循环往复 一直调整。

有序的过程:将第一个数(最大值 0位置)和最后一个数互换,将size-1,并且从第一个数0位置开始,如果它的左右节点比他大,将最大值和他交换,此时又形成了一个大根堆,将第一个数和最后一个值交换, 例如 7 |8 —|7 8 循环往复形成有序。

然后左右节点中大的和父节点比较,如果还是父节点大, 整个程序while退出break, 如果不是最大值和父节点值交换,父节点下标变为最大值的下标,左节点=largest x2+1,继续比较处于最大值下标位置的父节点(即父节点一致循环比较,直到找到最大值在进行下一次循环) ,然后0位置的最大值和最后一个位置交换,size-1
在这里插入图片描述
不需要额外空间,空间复杂度O(1).建立大根堆的时间复杂度O(N) 堆排序复杂度(O(N*logN))堆排序不稳定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值