1. 堆排序简介
堆排序包括两个过程:
1)建堆:将原有序列建成最小堆(或最大堆)
具体过程(为了加强理解):
从第length/2个树节点开始遍历,每次根据大小调整以该节点为根的子树的顺序,使其成为最小堆;
因此需要遍历多遍,每次遍历中都调整从当前节点到最后一个节点的树,使成为最小堆。
2)排序:每次将堆顶元素调整到最后位置;再调整堆结构,使其成为最小(大)堆;
2. java实现
重点是adjust方法,实现从begin节点到end节点的调整(调整使成为最小堆)。
//实现堆排序;
public static void heapSort(int[] nums) {
int length=nums.length;
int k=length/2-1;
for(int i=k;i>=0;i--) {
adjust(i,length,nums);
}
int count=length-1;
while(count>0) {
swap(count,nums);
adjust(0,count,nums);
count--;
}
}
private static void swap(int count, int[] nums) {
int temp=nums[count];
nums[count]=nums[0];
nums[0]=temp;
}
private static void adjust(int begin, int end, int[] nums) {
//从begin-end调整;
//begin先与叶节点比较大小,选择一个较小者,后继续向下比较;
int temp=nums[begin];
for(int k=2*begin+1;k<end;k=2*k+1) {
if(k+1<end&&nums[k]<nums[k+1])
k++;
if(nums[k]>temp) {
nums[begin]=nums[k];
begin=k;
}else break;
}
nums[begin]=temp;
}