• 堆排序 java


    <pre name="code" class="java">package heapSort;
    /**
     * 大根堆
     * @author root
     *
     */
    public class HeapSort {
    	
    	static int[] data = {0,9,4,6,2,5};
    	static int[] data1 = {0,2,4,5,3,1,7,6};
    	
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		sort(data1);
    		print(data1);
    	}
    	//堆排序
    	public static void sort(int[] data){
    		int length = data.length-1;
    		//建立大根堆,从最后一个孩子节点开始,依次向下调整
    		for(int i=length/2; i>0; --i){
    			heapAjdust1(data, i, length);
    		}
    		//排序(每次将堆顶放到后面,然后调整堆)
    		for(int i=length; i>1; --i){
    			int t = data[1];
    			data[1] = data[i];
    			data[i] = t;
    			heapAjdust1(data, 1, i-1);
    		}
    	}
    	//向下调整(课本上的)
    	public static void heapAjdust(int[] data, int s, int m){
    		int temp = data[s];
    		for(int j=2*s; j<=m; j*=2){
    			if((j+1)<=m && data[j]<data[j+1])
    				j++;
    			if(data[s]>=data[j])
    				break;
    			data[s] = data[j];
    			s=j;
    		}
    		data[s] = temp;
    	}
    	/**
    	 * 向下调整(自己改写的),大于孩子节点则跳出,否则与较大孩子交换,继续向下调整
    	 * @param data
    	 * @param s 需要向下调整的节点序号
    	 * @param m 最后一个节点序号
    	 */
    	public static void heapAjdust1(int[] data, int s, int m){
    		for(int j=2*s; j<=m; j*=2){//从s的子节点开始,一直到最后一个节点
    			//取较大节点
    			if((j+1)<=m && data[j]<data[j+1])//有有右节点,并且左节点小于右节点
    				j++;
    			if(data[s]>=data[j])//s节点值大于较大节点,则s节点比其所有子孙都大,结束
    				break;
    			int t = data[s];//s小于孩子,将s与孩子交换
    			data[s] = data[j];
    			data[j] = t;
    			s=j;//s转到孩子节点上,继续与孩子比较
    		}
    	}
    	
    	public static void print(int[] data){
    		for(int i=1; i<data.length; i++){
    			System.out.println(data[i]);
    		}
    	}
    }
    


    
       
    
    
  • 相关阅读:
    理解 RESTful:理论与最佳实践
    Shiro 性能优化:解决 Session 频繁读写问题
    单点登录的三种实现方式
    理解 Spring(二):AOP 的概念与实现原理
    理解 Spring(一):Spring 与 IoC
    MFC查内存泄漏方法
    024 --- 第28章 访问者模式
    023 --- 第27章 解释器模式
    022 --- 第26章 享元模式
    021 --- 第25章 中介者模式
  • 原文地址:https://www.cnblogs.com/yan456jie/p/5369405.html
Copyright © 2020-2023  润新知