码迷,mamicode.com
首页 > 其他好文 > 详细

二叉堆

时间:2016-10-01 15:00:52      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

import java.util.Scanner ;

public class HeapSort{
	int[] h ;
	int n ;

	public void swap(int[] array, int x, int y){        //简单的交换函数;
		int t = array[x] ;
		array[x] = array[y] ;
		array[y] = t ;
	}

	public void siftDown(int i){                       //下滤;一般在删除最小或最大元素后,将最后一个元素放到根节点的位置,进行下滤操作,以保持堆的堆序性;
		boolean flag = true ;
		while(2*i<=n && flag == true){
			int t ;
			if (h[i]>h[i*2]) {
				t = i*2 ;
			}else{
				t = i ;
			}

			if (i*2+1<=n) {
				if (h[t]>h[i*2+1]) {
					t = i*2+1 ;
				}
			}

			if (t!=i) {
				swap(h,i,t) ;
				i = t ;
			}else{
				flag = false ;
			}
		}
	}

	public void siftDown02(int i){               //下滤操作,递归版本;
		if(2*i<=n){
			int t ;
			if (h[i]>h[i*2]) {
				t = i*2 ;
			}else{
				t = i ;
			}

			if (i*2+1<=n) {
				if (h[t]>h[i*2+1]) {
					t = i*2+1 ;
				}
			}

			if (t!=i) {
				swap(h,i,t) ;
				siftDown02(t) ;
			}
		}
	}
	
	public void siftUp(int i){               //上滤,一般在最后位置插入新元素后,通过上滤操作,以维持堆的堆序性;
		boolean flag = true ;
		if (i!=1) {
			while(i!=1 && flag == true){
				if (h[i] < h[i/2]) {
					swap(h,i,i/2) ;
				}else{
					flag = false ;
				}
				i = i/2 ;
			}
		}
	}

	public void siftUp02(int i){            //上滤操作,递归版本;
		if (i!=1) {
			if (h[i] < h[i/2]) {
				swap(h,i,i/2) ;
				siftUp(i/2) ;
			}			
		}	
	}

	public void insert(int value){           //插入操作;
		n++ ;
		h[n] = value ;
		siftUp(n) ;
	}

	public void createHeap(){                 //创建堆;
		for (int i=n/2;i>=1;i--) {
			siftDown02(i) ;
		}
	}

	public int deleteMin(){                    //删除最小元素;
		int t = h[1] ;
		h[1] = h[n] ;
		n-- ;
		siftDown02(1) ;
		return t ;
	}

	public static void main(String[] args){         //测试;
		HeapSort hs = new HeapSort() ;
		hs.h= new int[101] ;
		
		System.out.println("please input ‘n =‘:") ;
		Scanner sc = new Scanner(System.in) ;
		int num = sc.nextInt() ;
		for (int i=1;i<=num;i++) {
			hs.h[i] = sc.nextInt() ;
		}

		hs.n = num ;
		hs.createHeap() ;
		hs.insert(45) ;

		while(hs.n>=1){
			System.out.print(hs.deleteMin() + " ") ;			
		}
		System.out.println() ;
		
	}
}

二叉堆

标签:

原文地址:http://www.cnblogs.com/lshl/p/5925802.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!