堆排序(C#)
(二叉)堆数据结构是一种数组对象,它可以被视为一颗完全二叉树.
完全二叉树(Complete Binary Tree)
若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的节点都连续集中在最左边,这就是完全二叉树。
完全二叉树是由满二叉树而引出来的。对于深度为K的,有N个结点的二叉树,
当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
(完全二叉树)
在堆中对于某一节点i,如果它有左右儿子,则左儿子Left(i)的索引(从0开始)为i*2+1,
右儿子Right(i)的索引为i*2+2,节点i的父节点索引为(i-1)/2.
代码如下:
public static int [] MinHeapSort(int [] a) { BulidMinHeap(a); int aLenght = a.Length; int heapSize = aLenght; int [] sorttedArray = new int [a.Length]; for (int i = 0; i < aLenght; i++) { sorttedArray[i] = a[0]; a[0] = a[heapSize - 1]; MinHeapify(a, 0, heapSize--); } return sorttedArray; } public static void BulidMinHeap(int [] a) { for (int i = a.Length / 2 - 1; i >= 0; i--) { MinHeapify(a, i, a.Length); } } public static void MinHeapify(int [] a, int i, int heapSize) { int left = i * 2 + 1; int right = i * 2 + 2; int mivValueIndex = i; if (left < heapSize && a[i] > a[left]) { mivValueIndex = left; } if (right < heapSize && a[mivValueIndex] > a[right]) { mivValueIndex = right; } if (mivValueIndex != i) { int temp = a[i]; a[i] = a[mivValueIndex]; a[mivValueIndex] = temp; MinHeapify(a, mivValueIndex, heapSize); } }