堆排序(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