堆排序个人理解
将数组看做是完全二叉树进行设计,比较通过比较孩子节点和父节点的值,构造大顶堆。将大顶堆中顶部的值与最小的值进行交换。然后继续构造大顶堆,依次类推,直到完成排序
其算法如下:
/** * 以parent为父节点进行比较,构建部分大顶堆,只要出现父节点比子节点都大,就结束。 * @param a * @param parent * @param length */
private static void createDaDingDui(int[] a, int parent, int length) { // tempParent:临时变量用于保存父节点 int tempParent; //child:临时变量用于保存最大孩子节点 int child; for (tempParent = a[parent]; 2*parent+1 <= length; parent = child) { child=2 * parent + 1; // 如果左孩子节点小于右孩子节点,将右孩子节点给最大孩子节点 if (child < length && a[child] <= a[child+1]) { child++; } // 如果父节点小于最大孩子节点,将最大孩子节点的值与父节点进行交换。否则直接跳出本次循环 if (tempParent < a[child]) { a[parent] = a[child]; } else { break; } } a[parent] = tempParent; } public static void duiSort(int[] array){ //构建大顶堆。先构建大顶堆,以下标为array.length/2-1出的值为父节点, //依次向上进行比较构建大顶堆。以后再比较时,每必要从下往上在进行比较一次,等于优化作用。 for (int i = array.length / 2-1; i >= 0; i--) { createDaDingDui(array, i, array.length - 1); } //将大顶堆顶部值与最后一个值进行交换。在重新找构造大顶堆,因为该大顶堆只有 //最上一个数据最小,所以依次与其子节点进行比较,交换值,构建新的大顶堆。 for(int i=array.length-1;i>=0;i--){ int temp=array[0]; array[0]=array[i]; array[i]=temp; createDaDingDui(array, 0, i-1); } }
作者:张九星
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。