public class HeapSort {
private int [] data;
public HeapSort(int[] data) {
this.data = data;
}
public void sort(){ //堆排序包含AB两步
//A构建大顶堆
for(int i=data.length/2 - 1; i >= 0; i--){ //选出每个父节点,交给 adjustHeap方法进行调整将父节点调为大值
adjustHeap(i,data.length);
}
//B循环砍头并调整
for(int j=data.length-1;j>0;j--) { //j--表示已经被砍出去的元素不再参与调整堆
swap(0,j);
adjustHeap(0,j);
}
}
public void swap(int a,int b) {
int t=data[a];
data[a]=data[b];
data[b]=t;
}
private void adjustHeap(int i,int length){ //i为开头位置,父节点的序号
int temp = data[i]; //temp为父节点
for(int k=i*2+1;k<length;k=k*2+1){ //k为左孩子序号,对左孩子依次进行循环,将父节点调整为最大值(该循环最终目的将最大值放在父节点)
if(k+1<length&&data[k]<data[k+1]){ //1.该if是选出左右孩子的最大值。右孩子序号<总长度,左<右,就需要改掉k的指向;左>右,不需要改掉k的指向
k++;
}
if(data[k]>temp){ //2.该if是调整父节点为最大值。左右节点最大值>父节点,调整父节点为最大值(注意:这是if,不是else if)
data[i]=data[k];
i=k;
}else{ //不需要调整了
break;
}
}
data[i]=temp; //此时的父节点已为最大值,结束
}
public String toString() {
return Arrays.toString(data);
}
public static void main(String[] args) {
int arr [] =new int[]{13,23,34,12,8,354,6,123,9,245,23,7,812,19};
HeapSort heapSort = new HeapSort(arr);
heapSort.sort();
System.out.println(heapSort);
}
}
public class HeapSort {
public static void main(String[] args) {
int[] arr=new int[] {6,59,67,16,17,19,25,66};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void heapSort(int[] arr) {
for(int i=(arr.length-1)/2;i>=0;i--) {
adjust(arr,i,arr.length);
}
for(int i=arr.length-1;i>0;i--) {
int temp=arr[i];
arr[i]=arr[0];
arr[0]=temp;
adjust(arr,0,i);
}
}
private static void adjust(int[] arr,int parent,int length) {
int temp=arr[parent];
int lChild=2*parent+1;
while(lChild<length) {
int rChild=lChild+1;
if(rChild<length&&arr[lChild]<arr[rChild]) {
lChild++;
}
if(temp>=arr[lChild]) {
break;
}
arr[parent]=arr[lChild];
parent=lChild;
lChild=2*lChild+1;
}
arr[parent]=temp;
}
}