您的位置:首页 > 编程语言 > Java开发

Java 排序之 堆排序

2014-08-06 23:28 211 查看
堆排序:具有原址性 且 复杂度为O(nlgn)

集中了插入排序和归并排序的优点。

堆 是一个数组,可以看成一个近似的完全二叉树,除了最底层外,该树是完全充满的。而且从左到右从满。

给定一个节点的下标为i,

父节点: i/2

左节点下标

Left(i) = 2 * i;

右节点下标

Right(i) = 2*i +1;

如果下标冲0 开始而不是1开始的话

int left = index * 2+1;

int right = index * 2 + 2;

最大堆:

堆中最大的元素放在跟节点中,该子树包含的所有节点的值都不得大于该子树的根节点的值。

public void heapSort(int[] array){
buildMaxHeap(array);
int heapSize = array.length;
for(int i = array.length-1;i>0;i--){
swap(array,0,i);
heapSize--;
maxHeapify(array,heapSize,0);
}

}
public void maxHeapify(int[] array, int heapSize,int index){
int left = index * 2+1;
int right = index * 2 + 2;
int largest = index;
if(left < heapSize && array[left] > array[index])
largest = left;
if(right < heapSize && array[right] > array[largest])// largest 而不是 index
largest = right;
if(largest != index){
swap(array,index,largest);
maxHeapify(array, heapSize, largest);
}
}

public void buildMaxHeap(int[] array){
int heapSize = array.length;
for(int i = heapSize/2; i >= 0;i--){
maxHeapify(array,heapSize,i);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐