标签:end 稳定性 evel length eve data style pre 结构
(1)n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质):
k(i)<=k(2i)且k(i)<=k(2i+1)(1≤i≤ n/2),
当然,这是小根堆,大根堆则换成>=号。
(2)k(i)相当于二叉树的非叶子结点,K(2i)则是左子节点,k(2i+1)是右子节点
若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:
树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。
/** * 堆排序 * @param data 数据队列 */ public static void heapSort(int[] data) { //初始化大堆 for (int i = data.length / 2 - 1; i >= 0; i--) { adjustHeap(data, i, data.length); //指定父节点堆调整 } int temp; //临时空间 for (int i = data.length - 1; i > 0; i--) { //堆首与堆尾交换 temp = data[i]; data[i] = data[0]; data[0] = temp; //大堆调整 adjustHeap(data, 0, i); } } /** * 堆调整 * @param data 数据队列 * @param start 起始位置 * @param end 截止位置,是堆尾的下一个位置 */ public static void adjustHeap(int[] data, int start, int end) { int src=data[start]; //保存起始位置的值 for (int i = start * 2 + 1; i < end; i *= 2 + 1) { //判断左右节点大小 if (i < end - 1 && data[i] < data[i + 1]) { i++; //右节点大 } //起始位置值最大 if(data[start]>data[i]) break; data[start]=data[i];//赋值最大值 start=i; //记录大值的位置 } data[start]=src;//回填大值位置 }
平均性能O(N*logN),由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
标签:end 稳定性 evel length eve data style pre 结构
原文地址:http://www.cnblogs.com/maokun/p/7078073.html