堆排序———Java实现
堆排序步骤:
- 创建堆
- 将堆顶元素与数组最后一个元素进行交换并调整堆
//堆排序
public void HeapSort(int a[]){
//创建大顶堆
for (int i = a.length/2-1; i>=0; i--) {
adjust(a,i,a.length);
}
//将堆顶元素与最后一个节点交换并调整堆
for (int j = a.length-1; j >0 ; j--) {
swap(a,0,j);
adjust(a,0,j);
}
}
//调整堆
public void adjust(int a[],int i,int length){
int tmp=a[i];
for (int k = 2*i+1; k <length; k=2*k+1) {//找出左右孩子中最大值
if (k+1<length && a[k]<a[k+1]){
k++;
}
if (a[k]>tmp){//将左右孩子最大值大于父节点,需交换值
a[i]=a[k];
i=k;
}
else break;//说明此时没发生调整,跳出循环
}
a[i]=tmp;//若发生交换,将最开始的父节点的值交换给最后一个交换的位置;若未发生交换,将原值赋回去
}
public void swap(int[] a,int i,int j ){//交换函数
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}