选择排序、堆排序

选择排序

选择排序是遍历一遍数组,选出最大或者最小的元素放在数组一边的方法,优化版本可以同时找到最大和最小元素,然后分别放到数组的右左两边,即使这样,效率仍然很低

堆排序

运用了选择排序的思想,只不过选出最大或最小的元素是通过建堆取堆顶元素实现的。

堆排序一共分为两步:建堆和排序

建大堆还是小堆与排升序降序有关。

排升序,建大堆,这样堆顶数据最大,与堆最后的数据交换后,再将堆顶数据向下调整就会得到第二大数据。建小堆也可以,但是取出堆顶最小数据后,下面的数据关系会乱掉,当然也可以把最后面元素补上来调整建堆,但是最小的数据需要额外空间先存储起来,会产生一定的效率问题。

排降序,建小堆,理由和上面一样。

我们这里排升序,建大堆。

建堆的方法可以有两种,而向下调整建堆的效率会更高,简单来说就是高层数据少,调整次数多,底层数据多,调整次数少,而向上调整建堆则相反,所以向下调整建堆会更快

建好大堆之后,堆顶数据即为最大数据,我们可以将堆顶数据与数组最后一个数据交换,最大数据就储存到了数组最后方。

后面向下调整时,要把数组的长度减去1,这样才能把存储起来的数据保护起来,找第二大数据。

我们再将新堆顶数据向下调整,得到的堆顶数据就是第二大元素,再次向下交换,循环这个过程,就能实现堆排序。

测试一下:

向下调整建堆的时间复杂度是O(N)(各层元素个数乘以向下调整高度之和),后面去堆顶元素排序的时间复杂度是O(N*logN)(遍历一遍n*向下调整高度logn),所以堆排序的时间复杂度是O(N*logN),是可以跟快速排序,希尔排序坐在同一张桌子上的排序。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值