堆排序:
一棵完全二叉树,如果父节点的值大于等于左右节点的值,则称此完全二叉树为小根堆(小顶堆);如果父节点的值小于等于左右节点的值,则次完全二叉树为大根堆(大顶堆)。堆排序是建立在大顶堆或小顶堆的基础上的,通过不断的交换堆顶元素和堆尾元素,来对数组排序。基于大顶堆的堆排序,数组排序结果是升序的。基于小顶堆的堆排序,数组排序结果是降序的。
流程:
(1)建立堆 (注意调整的顺序是:从右往左,从下往上) (2)交换堆顶与堆底元素 (3)调整堆(注意调整的顺序是:从0开始)代码:
public class DuiPaiXu { //堆排序 public static void heapSort(int[] array) { if(array == null || array.length <=1 ) { return; } int totalIndex = array.length-1; buildHeap(array,totalIndex); while(totalIndex > 0) { swap(array,0,totalIndex); if(--totalIndex == 0) { break; } adjustHeap(array,0, totalIndex); } } //根据数组建立堆 public static void buildHeap(int[] array,int totalIndex) { //注意这里i是从(totalIndex-1)/2-1开始的,因为我索引值是从0开始的。 for(int i=(totalIndex-1)/2-1; i>=0; i--) { adjustHeap(array,i, totalIndex); } } //调整堆 public static void adjustHeap(int[] array,int curIndex, int totalIndex) { int biggestIndex = curIndex; int leftIndex = 2*curIndex +1; int rightIndex = 2*curIndex +2; if(rightIndex <= totalIndex) { if(array[curIndex]array[rightIndex] ? leftIndex : rightIndex; } } else if(leftIndex <= totalIndex ) { if(array[curIndex]