关于堆排序的一些知识和代码(以最大堆为例)
- 堆排序实现的方法:利用堆的父节点大于子节点的特性来进行不断建堆使得最上面的元素始终未整个数组中的最大值,然后将该堆的最大值删除(放置于堆尾,即将堆的顶部与尾部元素进行交换),然后重复进行建堆操作,即可以实现对一个数组进行排序。
- 堆中元素在数组中的位置:若父节点位置为A,则左子节点的位置为2A+1,右子节点的位置为2A+2.
- 代码实现:
public class HeapSort {
public static void headjust(int[] list,int len,int i) {
int k=i;int temp=list[i];int index=2*k+1;
while(index<len) {
if(index+1<len) {
if(list[index]<list[index+1]) {
index=index+1;
}
}
if(list[index]>temp) {
list[k]=list[index];
k=index;
index=2*k+1;
}
else {break;}
}
list[k]=temp;
}
public static void headsort(int[] list) {
for(int i=(list.length/2)-1;i>=0;i--) {
headjust(list,list.length,i);
}
for(int i=list.length-1;i>=1;i--) {
int temp=list[0];
list[0]=list[i];
list[i]=temp;
headjust(list,i,0);
}
}
public static void main(String[] args) {
int[] list=new int[] {10,8,9,7,5,6};
headsort(list);
for(int m:list) {
System.out.println(m);}
}
}