堆排序(Heap Sort)算法的实现

堆排序算法思想非常简单,先把一个数组看成一个heap, 在下面的实现中,我使用的是max heap, 也就是说根总是比叶子大。所以我们第一步就是建立max heap。建立完毕以后,很明显这个heap的root就是最大的,把最大的根放在数组的最后一个位置,把数组长度缩小一个位置,这样最大的那个数就不会再参与到下次的排序当中,这时,除了根以外,heap的其它部分都保持max heap的特性,所以我们需要再做一次max heap (只对根做),再把最大的放在目前被缩小的数组的最后一个位置,重复下去,知道数组中只剩下一个数。

class HeapSortAlgorithm { public int heapSize; //heapSize is used to 'shorten' the length of the array. public void HeapSort(int[] array) { heapSize = array.Length; BuildMaxHeap(array); for (int i = array.Length - 1; i > 0; i--) { Swap(0, i, array); heapSize--; BuildMaxHeap(array); } } /// <summary> /// swap the elements in the array /// </summary> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="array"></param> private void Swap(int p1, int p2, int[] array) { int temp = array[p1]; array[p1] = array[p2]; array[p2] = temp; } /// <summary> /// MaxHeapify is to build the max heap from the 'position' /// </summary> /// <param name="array"></param> /// <param name="position"></param> public void MaxHeapify(int[] array, int position) { int left = Left(position); int right = Right(position); int maxPosition = position; if (left < heapSize && array[left] > array[position]) { maxPosition = left; } if (right < heapSize && array[right] > array[maxPosition]) { maxPosition = right; } if (position != maxPosition) { int temp = array[position]; array[position] = array[maxPosition]; array[maxPosition] = temp; MaxHeapify(array, maxPosition); } } /// <summary> /// build the max heap as a whole /// </summary> /// <param name="array"></param> public void BuildMaxHeap(int[] array) { for (int i = heapSize / 2 - 1; i >= 0; i--) { MaxHeapify(array, i); } } /// <summary> /// return the left child position /// </summary> /// <param name="i"></param> /// <returns></returns> public int Left(int i) { return 2 * i + 1; } /// <summary> /// return the right child position /// </summary> /// <param name="i"></param> /// <returns></returns> public int Right(int i) { return 2 * i + 2; } }

MaxHeapify的时间复杂度为 O(lgn), BuildMaxHeap的复杂度不是O(n lgn), 而是 O(n). 因为整个heap的高度为(\lfoor lgn \rfloor) (heap的高度是从0开始数的,也就是说高度为h,其实实际高度为h+1), 第 h 层element的个数为 (\lceil n/2^{h+1} \rceil), 记住,层数是从底层往上数的,第一层h = 0。所以总共 BuildMaxHeap 的复杂度为 \sum_{h=0}^{\lfoor lgn \rfloor}\lceil n/2^{h+1} \rceil O(h) = O (n\sum_{h=0}^{\lfoor lgn \rfloor}\lceil h/2^{h} \rceil). And\sum_{h=0}^{\infinity}\lceil h/2^{h} = 2, 因此我们有O(N)。

所以整个heap sort的复杂度为:O(n lgn).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值