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

算法基础复习-HeapSort

2016-11-01 15:46 211 查看
前言:为了后续的实习面试,开始疯狂刷题,非常欢迎志同道合的朋友一起交流。因为时间比较紧张,目前的规划是先过一遍,写出能想到的最优算法,第二遍再考虑最优或者较优的方法。如有错误欢迎指正。博主首发CSDN,mcf171专栏。

博客链接:mcf171的博客

——————————————————————————————
参考了两篇博客:1、堆排序(Heapsort)之Java实现;2、经典排序算法 - 堆排序Heap sort
堆排序主要分为两个个步骤

1、构建最大堆

2、进行堆排序

构建最大堆的时候,利用堆和数组的对应关系,第一个父节点为Array.length / 2 -1。然后往上逐层构建最大堆,时间复杂度最好O(n),平均O(nlogn),最坏O(nlogn);

进行堆排序的时候,将堆顶元素和最后一个元素swap,同时重新调整维护最大堆。再把堆顶元素和倒数第二个元素swap,同时调整维护最大堆。时间复杂度最好O(nlogn),平均O(nlogn),最坏O(nlogn);

因此堆排序的时间复杂度为:最好O(nlogn),平均O(nlogn),最坏O(nlogn);空间复杂度O(1)

public static void heapSort(int[] array){

if(array == null || array.length < 2) return;

buildHeap(array);

for(int i = array.length - 1; i >= 1; i --){
swap(array,0,i);
maxHeap(array,i,0);
}
}

private static void buildHeap(int[]array){

for(int i = array.length / 2 - 1; i>=0; i --){
maxHeap(array,array.length,i);
}
}

private static void maxHeap(int[] array, int heapSize, int index){

if(heapSize == 1) return;
int left = index * 2 + 1;
int right = index * 2 + 2;
int largest = index;
if(left < heapSize && array[left] > array[largest]) largest = left;
if(right < heapSize && array[right] > array[largest]) largest = right;
if(largest != index){

swap(array,index,largest);
maxHeap(array,largest,largest);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 算法