在堆排序中,待排序的记录被视为完全二叉树的节点,并按照完全二叉树的顺序存储结构进行组织。具体来说:
完全二叉树的定义:
完全二叉树是一种特殊的二叉树,其中除了最后一层外,每一层都是完全填满的,并且最后一层的节点都靠左对齐。
记录与节点的对应关系:
在堆排序中,待排序的记录(如数组中的元素)被一一对应地映射到完全二叉树的节点上。 数组中的第一个元素(通常索引为0或1,取决于编程语言的习惯)被视为完全二叉树的根节点。
节点索引的关系:
对于任意节点 Ki (其中 i 是节点在数组中的索引),其左孩子节点的索引为 2i(如果以1为根节点索引)或 2i+1如果以0为根节点索引)。 其右孩子节点的索引为 2i+1(如果以1为根节点索引)或 2i+22i+2(如果以0为根节点索引)。 其父节点的索引为 floor⌊i/2⌋(无论根节点索引是1还是0)。
堆的定义:
在堆排序中,完全二叉树被进一步定义为堆,即满足特定性质的完全二叉树。 小根堆:每个节点的值都小于或等于其子节点的值。 大根堆:每个节点的值都大于或等于其子节点的值。
堆排序的过程:
堆排序主要利用堆的性质进行排序。 首先,将待排序的记录构建成一个初始堆(通常是大根堆或小根堆)。 然后,通过不断将堆顶元素(最大值或最小值)与堆的最后一个元素交换,并减少堆的大小(即排除已排序的元素),再对剩余的元素重新调整成堆,直到整个序列有序。