选择排序
选择排序是遍历一遍数组,选出最大或者最小的元素放在数组一边的方法,优化版本可以同时找到最大和最小元素,然后分别放到数组的右左两边,即使这样,效率仍然很低
堆排序
运用了选择排序的思想,只不过选出最大或最小的元素是通过建堆取堆顶元素实现的。
堆排序一共分为两步:建堆和排序
建大堆还是小堆与排升序降序有关。
排升序,建大堆,这样堆顶数据最大,与堆最后的数据交换后,再将堆顶数据向下调整就会得到第二大数据。建小堆也可以,但是取出堆顶最小数据后,下面的数据关系会乱掉,当然也可以把最后面元素补上来调整建堆,但是最小的数据需要额外空间先存储起来,会产生一定的效率问题。
排降序,建小堆,理由和上面一样。
我们这里排升序,建大堆。
建堆的方法可以有两种,而向下调整建堆的效率会更高,简单来说就是高层数据少,调整次数多,底层数据多,调整次数少,而向上调整建堆则相反,所以向下调整建堆会更快
建好大堆之后,堆顶数据即为最大数据,我们可以将堆顶数据与数组最后一个数据交换,最大数据就储存到了数组最后方。
后面向下调整时,要把数组的长度减去1,这样才能把存储起来的数据保护起来,找第二大数据。
我们再将新堆顶数据向下调整,得到的堆顶数据就是第二大元素,再次向下交换,循环这个过程,就能实现堆排序。
测试一下:
向下调整建堆的时间复杂度是O(N)(各层元素个数乘以向下调整高度之和),后面去堆顶元素排序的时间复杂度是O(N*logN)(遍历一遍n*向下调整高度logn),所以堆排序的时间复杂度是O(N*logN),是可以跟快速排序,希尔排序坐在同一张桌子上的排序。