算法导论:堆排序
堆 堆是一个数组,它可以被看成一个近似的完全二叉树,树上的每一个结点对应数组中的一个元素。除去最底层外,该树是完全充满的,而且从左到右填充。 用数组A表示堆,从数组第1个元素开始,数组中第i(1<=i <=n)个元素,其父结点,左孩子,右孩子的下标如下 // 父结点 public int parent( int i){ return i/2; } // 左孩子 public int left(int i){ return 2*i; } // 右孩子 public int right(int i){ return 2*i+1; } 当数组起始下标是0的时候,其父结点,左右孩子结点如下 // 父结点 public int parent( int i){ return (i-1)/2; } // 左孩子 public int left(int i){ return 2*i+1; } // 右孩子 public int right(int i){ return 2*i+2; } 堆可以分为大顶堆和小顶堆 大顶堆:结点 i 的值 都大于其左右孩子结点的值 小顶堆:结点 i 的值 都小于其左右孩子结点的值 二叉树的形式与数组形式表达堆之间元素的关系 练习1,高度为h的堆,元素最少和最多是多少? 最多:这个完全二叉树第h层元素填满:2^h - 1 最少:第h-1层填满,第h层只有一个元素:2^