package Sort;
public class Heap {
private static int[] a = {0,99,5,36,7,22,17,46,12,2,19,25,28,1,92};
private static int n = a.length-1;//不取第一个位置
public static void main(String[] args) {
creat_heap();//建堆 用下沉法
heap_sort(); //排序
for(int i = 1;i < a.length;i++){
System.out.print(a[i]+" ");
}
}
private static void creat_heap() {
// TODO Auto-generated method stub
for(int i = n/2;i >= 1;i--){ //从第一个非叶子节点开始(因为叶子节点没有儿子,一定是符合要求的),直到第一个节点结束
sink(i); //不断调整,结束时就成为一个大顶堆
}
}
public static void heap_sort() {
// TODO Auto-generated method stub
while(n > 1){
swap(1,n); //数组的第一个元素是最大的,将第一个元素和最后一个元素交换,这时最后一个元素就是最大的。。
n--; //n-- 缩小数组的范围
sink(1); //重新调整第一个元素的位置,使数组的第一个元素是剩余数组中最大的那个
}
}
private static void sink(int i) { //将i调整到正确的位置
// TODO Auto-generated method stub
int j;
while(2*i <= n){//判断是否有左儿子,有就一直比较下去,没有了就停止
j = 2*i; //左儿子
if(j+1 <= n && a[j] < a[j+1]){//如果还有右儿子,并且左儿子比右儿子小,就和右儿子交换 因为j总是记录那个较大的
j = j+1; //用j来记录要俩个儿子中较大的那一个,这个位置就是交换后i的位置
}
if(a[i] >= a[j])//左右儿子都比自己小的时候说明已经有序了,i已经到了正确的位置
break;
else{
swap(i,j);
i = j;
}
}
}
private static void swap(int i, int j) {
// TODO Auto-generated method stub
int t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
堆排序
最新推荐文章于 2023-05-28 11:19:59 发布