堆排序
对于堆,其是一个完全二叉树的结构。如果是数组存储的话(索引值重0开始),其父节点的索引值为(i-1)/2,左孩子结点的索引为2*i+1,右孩子结点索引为2*i+2。
对堆的调整
public static void heapAdjust(int[] A,int i,int size){ int leftChild=i*2+1; int rightChild=i*2+2; int max=i; if(i<size){ if(leftChild<size&&A[leftChild]>A[max]){ max=leftChild; } if(rightChild<size&&A[rightChild]>A[max]){ max=rightChild; } if(max!=i){ //交换之后,逐级调整 int temp=A[i]; A[i]=A[max]; A[max]=temp; heapAdjust(A, max, size); } } }
建堆
public static void buildHeap(int[] A,int size){ for(int i=size/2;i>=0;--i){ heapAdjust(A, i, size); } }
堆排
public static void heapSort(int[]A,int size){ buildHeap(A, size); for(int i=size-1;i>=0;--i){ int temp=A[i]; A[i]=A[0]; A[0]=temp; System.out.println(A[i]); heapAdjust(A, 0, i); } }