java实现堆排序

package MySort;

public class HeapSort {
    public static void main(String[] args){
    	HeapSort hs=new HeapSort();
        int[] R={49,38,65,97,76,13,27,49};
        hs.heapSort(R);
        for(int i=0;i<R.length;i++){
        	System.out.println(R[i]);
        }
    }
    public void heapSort(int[] R){
	    //该for循环用于创建一个堆,从n/2-1开始向前调整
    	for(int i = R.length/2-1;i>=0;i--){//r.length/2-1为最后一个非终端节点,向前调整
    		heapAdjust(R,i,R.length);
    	}
	    //该for循环用于把堆顶元素和无序区的最后一个元素交换,成为有序区的第一个元素,并进行堆调整
    	for(int j=R.length-1;j>0;j--){//每次调整出一个元素,则进行n-1趟排序
    		int temp=R[j];
    		R[j]=R[0];
    		R[0]=temp;
    		heapAdjust(R,0,j);
    	}
    }
    public void heapAdjust(int[] R,int s,int m){
    	int temp = R[s];//暂存
    	for(int j=2*s+1;j<m;j=j*2){
    		if(j<m-1&&R[j]<R[j+1]){//找出这个根节点的两个子节点中的最大的
    			j++;    //j<m-1防止最后一个只有一个子节点,越界
    		}
    		if(temp>R[j]){//如果该元素已经是最大元素,则不用进行交换,直接跳出循环,自己与自己交换
    			break;
    		}else{//否则,需要进行交换
    			R[s]=R[j];
    			s=j;//s被赋予新值,接着从该节点向下遍历子节点
    		}
    	}
    	R[s]=temp;//一直找到大于或小于两个子节点的时候,把根节点放入该位置
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值