堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
通常堆是通过一维数组来实现的。在起始数组为 0 的情形中:
父节点i的左子节点在位置 (2*i+1);
父节点i的右子节点在位置 (2*i+2);
子节点i的父节点在位置 floor((i-1)/2);
在堆的数据结构中,堆中的最大值总是位于根节点。堆中定义以下几种操作:
最大堆调整(maxHeapify):将堆的末端子节点作调整,使得子节点永远小于父节点
创建最大堆(buildMaxHeap):将堆所有数据重新排序
堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算
现在给出C#实现的堆排序:
1 public class HeapSort<T> : ISort<T> where T : IComparable<T> 2 { 3 public void Sort(T[] array, int startIndex, int endIndex) 4 { 5 //Heapify the array 6 buildMaxHeap(array, startIndex, endIndex); 7 //Sort from endIndex to (startIndex-1), 8 //when i=startIndex, then only one node left,then no any requirement to heapify it. 9 for (int i = endIndex; i > startIndex; i--) 10 { 11 //swap array[i] and array[startIndex] 12 T tmpT = array[i]; 13 array[i] = array[startIndex]; 14 array[startIndex] = tmpT; 15 maxHeapify(array, startIndex, i - 1, startIndex); 16 } 17 } 18 private void buildMaxHeap(T[] array, int startIndex, int endIndex) 19 { 20 //Leaf node is from (endIndex-startIndex+1)/2+1+startIndex to endIndex 21 // //O(n*Log(n)) 22 for (int i = (endIndex - startIndex + 1) / 2 + startIndex; i >= startIndex; i--) 23 { 24 //O(Log(n)) 25 maxHeapify(array, startIndex, endIndex, i); 26 } 27 } 28 29 //insert a new root node for two child maxHeap. 30 private void maxHeapify(T[] array, int startIndex, int endIndex, int newRootIndex) 31 { 32 33 //int L = (newRootIndex - startIndex) * 2 + 1 + startIndex; 34 int L = (newRootIndex - startIndex + 1) * 2 + startIndex - 1;//The array base is from 0. 35 int R = L + 1; 36 int tmpLargestIndex = newRootIndex; 37 if (L <= endIndex && array[L].CompareTo(array[tmpLargestIndex]) > 0) 38 { 39 tmpLargestIndex = L; 40 } 41 if (R <= endIndex && array[R].CompareTo(array[tmpLargestIndex]) > 0) 42 { 43 tmpLargestIndex = R; 44 } 45 if (tmpLargestIndex != newRootIndex) 46 { 47 //swap array[tmpLargestIndex] and array[newRootIndex] 48 T tmpT = array[tmpLargestIndex]; 49 array[tmpLargestIndex] = array[newRootIndex]; 50 array[newRootIndex] = tmpT; 51 //MaxHeapify the child branch, the newRootIndex= tmpLargestIndex 52 maxHeapify(array, startIndex, endIndex, tmpLargestIndex); 53 } 54 } 55 }
作者:Andy Zeng
欢迎任何形式的转载,但请务必注明出处。