堆排序个人理解

将数组看做是完全二叉树进行设计,比较通过比较孩子节点和父节点的值,构造大顶堆。将大顶堆中顶部的值与最小的值进行交换。然后继续构造大顶堆,依次类推,直到完成排序

  其算法如下:


       /**
* 以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);
                }
                
            }

 

posted @ 2017-09-30 17:13  九星  阅读(197)  评论(0编辑  收藏  举报