数据结构与算法(11)---Java语言实现:堆排序

来源:互联网 发布:plsql输入ip连接数据 编辑:程序博客网 时间:2024/06/05 12:39

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。


堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。
平均性能
O(N*logN)。
其他性能
由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
堆排序是就地排序,辅助空间为O(1).
它是不稳定的排序方法。(排序的稳定性是指如果在排序的序列中,存在前后相同的两个元素的话,排序前 和排序后他们的相对位置不发生变化)


Java实现代码:

package 算法;public class Demo7 {//堆排序主方法public static void heapSort(int[] arry){arry=buildHeap(arry);//构建大顶堆for(int i=arry.length-1;i>0;i--){int temp=arry[0];arry[0]=arry[i];arry[i]=temp;//将堆顶存到最后,最后一个元素存到堆顶adjustHeap(arry,0,i);//确定最后一个元素最大之后继续调整前面元素}}public static int[] buildHeap(int[] arr){for(int j=(arr.length-2)/2;j>=0;j--){//构造大顶堆adjustHeap(arr, j,arr.length );}return arr;}public static void adjustHeap(int[] arr,int star,int len){//调整堆int temp=arr[star];for(int i=star*2+1;i<len-1;i=i*2+1){if(i<len && arr[i]<arr[i+1]){i++;}if(temp>=arr[i]){break;}arr[star]=arr[i];star=i;}arr[star]=temp;}    public static void main(String[] args){//测试方法int arr[]={7,4,8,3,5,2,1,6,10,27,12,23};heapSort(arr);for(int i=0;i<arr.length;i++){//逐项输出System.out.print(arr[i]+" ");}}}

输出结果:

1 2 3 4 5 6 7 8 10 12 23 27 


阅读全文
0 0