堆定义:
堆是一种完全二叉树,每个结点都大于等于其子结点的称为大顶堆,每个结点都小于等于其子结点的称为小顶堆。
堆排序定义:
将待排序的序列构造成一个大顶堆,此时堆顶是最大值,将其移到序列最末端后,剩余的序列重新构造一个大顶堆,如此反复直到得到一个有序序列。
时间复杂度:O(nlogn)
实现:
public class Heap {
public void sort(int[] arr){
int i;
for(i=arr.length/2-1;i>=0;i--){
heap(arr,i,arr.length);
}
System.out.println("the heap ...");
SortUtils.print(arr);
for(i=arr.length-1;i>1;i--){
SortUtils.swap(arr,i,0);
System.out.print("new arr: ");
SortUtils.print(arr);
System.out.print("new heap: ");
heap(arr, 0, i);
SortUtils.print(arr);
}
}
/**
* 构造大顶堆
*
* @param arr
* @param s
* @param len
*/
private void heap(int[] arr,int s,int len){
int tmp=arr[s];
int i;
for(i=2*s+1;i<len-1;i=i*2+1){
if(arr[i] <arr[i+1]) i++;
if(arr[i]<=tmp) break;
arr[s]=arr[i];
s=i;
}
arr[s]=tmp;
}
public static void main(String[] args){
int[] arr=SortUtils.getArray();
Heap heap = new Heap();
heap.sort(arr);
}
}