您的位置:首页 > 其它

排序算法(六):堆排序

2013-12-27 15:58 127 查看
堆定义:

堆是一种完全二叉树,每个结点都大于等于其子结点的称为大顶堆,每个结点都小于等于其子结点的称为小顶堆。

堆排序定义:

将待排序的序列构造成一个大顶堆,此时堆顶是最大值,将其移到序列最末端后,剩余的序列重新构造一个大顶堆,如此反复直到得到一个有序序列。

时间复杂度: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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: