本文主要是介绍堆排序复杂度为O(nlogn),需要注意的误区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文希望阐述堆排序O(nlogn)的一些关键细节,摘录一篇博文O(n^2)进行比较。
用作比较的原文 版权声明:为者常成,行者常至
堆排序的特点是优化后的选择排序,其时间复杂度为O(nlogn),下面第一段代码的做法比这个复杂度要高。原因在下文阐述。
堆排序将要排序的对象看做一颗完全二叉树,数据结构可以用数组来实现。
初始化建堆过程时间:O(n) 更改堆元素后重建堆时间:O(nlogn)
具体证明可见:http://blog.csdn.net/yuzhihui_no1/article/details/44258297
下面的做法是在建好堆之后,交换堆顶和堆底之后,又执行了重建堆的过程。复杂度应该为O(n^2)。
待比较程序代码如下:
改进的重建堆的过程
public class HeapSorter implements Sorter{/* (non-Javadoc)* @see A4.Sorter#sort(java.lang.Comparable[])*/@Overridepublic void sort(Comparable[] data) {buildMaxHeap(data,data.length);}int parent(int i){return (i-1)/2;}int left(int i){return 2*i+1;}int right(int i){return 2*i+2;}/*** 将堆排序选出的最大的元素放到数组的最后位置。* 下午10:38:26* 2017年11月29日* @author city*/private void buildMaxHeap(Comparable[] data, int heapSize) {// First Step build Max-heapfor(int i = heapSize/2-1;i>=0;i--) {maxHeapfy(data,i,heapSize);}for(int i = data.length-1;i>0;i--){Comparable tmp = data[i];data[i] = data[0];data[0] = tmp;maxHeapfy(data, 0, i);}}/*** 堆排序算法核心,建立最大堆。* 下午10:39:54* 2017年11月29日* @author city*/private void maxHeapfy(Comparable[] data, int i, int heapSize) {// TODO Auto-generated method stubint left = left(i);int right = right(i);int largest = i;if(left<heapSize && data[left].compareTo(data[largest])>0){largest = left;}if(right<heapSize && data[right].compareTo(data[largest])>0){largest = right;}if(largest!=i){Comparable tmp = data[largest];data[largest] = data[i];data[i] = tmp;maxHeapfy(data, largest, heapSize);}}
}
如有错误,请指正
比较原文转载自http://blog.csdn.net/qq_35178267/article/details/78313306#insertcode
如有侵权请联系
这篇关于堆排序复杂度为O(nlogn),需要注意的误区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!