算法基础复习-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);
}
}
博客链接: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);
}
}
相关文章推荐
- 算法基础复习-RadixSort
- 自己动手写算法.Sort.HeapSort
- 自己动手写算法.Sort.HeapSort
- 一步一步复习数据结构和算法基础-循环链表
- heap sort算法实现
- 一步一步复习数据结构和算法基础-栈的应用(2)
- 算法总结系列之一:堆排序(Heap Sort)
- 一步一步复习数据结构和算法基础-稀疏矩阵基本操作
- 一步一步复习数据结构和算法基础-线性表
- 一步一步复习数据结构和算法基础-链表(3)
- 一步一步复习数据结构和算法基础-KMP算法
- 算法总结系列之一:堆排序(Heap Sort)
- 堆排序(Heap Sort)算法的实现
- 复习:支持向量机的理论基础—学习算法的实现方法
- 一步一步复习数据结构和算法基础-单链表冒泡排序
- 自己动手写算法.Sort.HeapSort
- 复习:支持向量机的理论基础-学习算法的构造
- 【数据结构与算法基础】单链表及其应用基数排序 / Singly Linked List and radix sort
- 一步一步复习数据结构和算法基础-栈和队列(2)
- 一步一步复习数据结构和算法基础-堆分配存储表示串