package Heapsort;
public class TestMain 
{
	/**
	 * 调整堆
	 * @param array  数组
	 * @param i      调整的元素i
	 * @param length 堆元素个数
	 */
	public static void  adaptationArray(int[] array,int i, int length)
	{
		// 当前元素
		int cur = i;
		while(2*cur+2<=length)
		{
		    int curValue = array[cur];
		    int leftValue = array[2*cur+1];
		    int maxIndex;
		    if(2*cur+3<=length) //有右孩子节点
		    {
		    	maxIndex = array[2*cur+2]>leftValue?2*cur+2:2*cur+1;
		    }
		    else
		    {
		    	maxIndex = 2*cur+1;
		    }
		    //当前值大于左右节点值,则结束
		    if(curValue>=array[maxIndex])
		    {
		    	break;
		    }
		    array[cur] =  array[maxIndex];
		    array[maxIndex] = curValue;
		    cur = maxIndex;
		}
	}
	/**
	 * 初始化最大堆
	 * @param array
	 */
	public static void initArray(int[] array)
	{
		//从start位置到0
		int start = array.length/2-1;
		for(;start>=0;start--)
		{
			adaptationArray(array,start,array.length);
		}
	}
	/**
	 * 排序
	 * @param array
	 */
	public static void sortArray(int[] array)
	{
		//初始化最大堆
		initArray(array);
		int start = array.length-1; //依次将首元素与倒数的元素交换位置
		for(;start>0;start--)
		{
			int temp = array[0];
			array[0] = array[start];
			array[start] = temp;
			adaptationArray(array,0,start);
		}
	}
	
    public static void main(String[] args)
    {
    	int[] array ={20,23,6,7,3,4,5,100,29,1};
    	sortArray(array);
    	for(int i:array)
    	{
    		System.out.print(i+",");
    	}
    }
}
                    
                
                
            
        
浙公网安备 33010602011771号